写点什么

c#包含日志输出的项目搭建

用户头像
happlyfox
关注
发布于: 2021 年 03 月 03 日

在工作过程中,我们总会碰到很多小型的功能点需要完成,以 LZ 自己的工作情况来举例,其中最频繁的是俩点

1、控制台项目

2、web 界面(纯前台)


##控制台项目

我们首先来谈控制台项目的工作内容,在没有使用 postMan[地址详见]()之前,工作中使用大量的接口调用,在项目准备阶段,首先要对接口的使用进行一个描述,在使用 WebService 和 Wcf 为主的服务接口为主的公司,使用 Vs 直接 <新建控制吧><添加服务引用>一套可视化的操作即可按接口通过代理类的方法进行引用,实在是 c#开发的乐趣所在。

废话不多说,现在主要说说工作中常用的功能点

1、测试服务接口

2、编写 windows 服务


服务接口

控制台项目完成此功能很简单,本文章主要突出的是一些常用的方法。

在编写类项目的过程中,主要会用到三个类库

1.Newtonsoftjson(json 序列化)

2.log4net(日志记录)

3.NUint(单元测试)


业务上无非就是调用接口测试,如果成功 Pass,如果失败记录日志。

单元测试的目的主要是为了,批量使用接口,测试接口的并发和其他操作所用


Windows 服务

windows 服务的使用场景在我的工作中主要结合任务调度来来做,同时配合一些其他的技术,像是队列,缓存等

例子:

1、每隔 10 秒同步一次 A 数据库数据(SqlServer)至 B 数据库(Oracle),表名称,字段名称均不一样

2、每天凌晨 2 点跑一项或多项任务,成功失败均记录日志+推送管理员(手机短信、邮件、内部服务平台)


大体上都是结合任务调度来做的,进行任务调试的库一般选用的是 Quartz.Net,console 服务转 Windows 服务用的是 topshelf,日志使用 Log4net

通过这三个组件就能够满足我的一般需求,其他的功能点按要求要引用不同的类库。


##简单项目搭建

###项目搭建 1.0

新建一个 console 项目,运行环境选择.Net Framework 4.5


新建解决方案

>建立三个类库

Common 基础层

Models 实体层

ScheduleTasks 任务具体任务



首先引用 Nuget 包,不同的层引用不同的 Nuget,再次简单说明

Common 基础层

>log4net、quartz.net


Models 实体层

>Sqlsugar


Schedules

>待定


进行不同的模块封装


####log4net 的引用和封装

log4Net 不需要做太多的封装,提供一个初始化,一个日志接口获取方法即可

    public class LogFactory    {        static LogFactory()        {            string path = AppDomain.CurrentDomain.BaseDirectory + @"/log4net.config";            FileInfo configFile=new FileInfo(path);            log4net.Config.XmlConfigurator.Configure();        }
public static ILog GetLogger(string name) { return LogManager.GetLogger(name); }
public static ILog GetLogger(Type type) { return LogManager.GetLogger(type); } }
复制代码


最简单的 config 日志配置

<?xml version="1.0" encoding="utf-8" ?><configuration>  <configSections>    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>  </configSections>  <log4net>    <!-- 控制台前台显示日志 -->    <appender name="Console" type="log4net.Appender.ColoredConsoleAppender">      <mapping>        <level value="DEBUG" />        <foreColor value="White" />      </mapping>      <mapping>        <level value="INFO" />        <foreColor value="Blue" />      </mapping>      <mapping>        <level value="WARN" />        <foreColor value="Yellow" />      </mapping>      <mapping>        <level value="ERROR" />        <foreColor value="Red, HighIntensity" />      </mapping>      <layout type="log4net.Layout.PatternLayout">        <conversionPattern value="时间:%date 级别:%-5level 日志记录器:%logger%n内容:%message%n%n" />      </layout>      <filter type="log4net.Filter.LevelRangeFilter">        <param name="LevelMin" value="Debug" />        <param name="LevelMax" value="Fatal" />      </filter>    </appender>
<appender name="LogByDate" type="log4net.Appender.RollingFileAppender"> <!--日志路径--> <param name= "File" value= "Log//"/> <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <!--是否是向文件中追加日志--> <param name= "AppendToFile" value= "true"/> <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--> <param name= "MaxSizeRollBackups" value= "-1"/> <param name="MaximumFileSize" value="10MB" /> <!--日志文件名是否是固定不变的--> <param name= "StaticLogFileName" value= "false"/> <!--固定后缀--> <PreserveLogFileNameExtension value="true" /> <param name="DatePattern" value="yyyyMMdd&quot;.log&quot;" /> <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> <param name= "RollingStyle" value= "Composite"/> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%n时间:%d [%t] %n级别:%-5p %n位置:[%thread] (%file:%line) %n消息描述:%message%n异常:%exception%n%n " /> </layout> </appender>
<!--root节点的作用是所有其它logger都默认继承它。--> <root> <!--配置日志的级别,低于此级别的就不写到日志里面去--> <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) --> <level value="ALL" /> <!--启用日志输入到控制台--> <appender-ref ref="Console"/> <appender-ref ref="LogByDate"/> </root> </log4net></configuration>
复制代码


至此 log4net 的工作完成


Newtonsoftjson


版本随便你自己使用


在程序的编码过程中经常会用到 json 的序列化和么序列化

编写一个简单的 help class

    /// <summary>    /// Json帮助类    /// </summary>    public class JsonHelper    {        /// <summary>        /// 将对象序列化为JSON格式        /// </summary>        /// <param name="o">对象</param>        /// <returns>json字符串</returns>        public static string SerializeObject(object o)        {            string json = JsonConvert.SerializeObject(o);            return json;        }
/// <summary> /// 解析JSON字符串生成对象实体 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="json">json字符串(eg.{"ID":"112","Name":"石子儿"})</param> /// <returns>对象实体</returns> public static T DeserializeJsonToObject<T>(string json) where T : class { JsonSerializer serializer = new JsonSerializer(); StringReader sr = new StringReader(json); object o = serializer.Deserialize(new JsonTextReader(sr), typeof(T)); T t = o as T; return t; }
/// <summary> /// 解析JSON数组生成对象实体集合 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="json">json数组字符串(eg.[{"ID":"112","Name":"石子儿"}])</param> /// <returns>对象实体集合</returns> public static List<T> DeserializeJsonToList<T>(string json) where T : class { JsonSerializer serializer = new JsonSerializer(); StringReader sr = new StringReader(json); object o = serializer.Deserialize(new JsonTextReader(sr), typeof(List<T>)); List<T> list = o as List<T>; return list; }
/// <summary> /// 反序列化JSON到给定的匿名对象. /// </summary> /// <typeparam name="T">匿名对象类型</typeparam> /// <param name="json">json字符串</param> /// <param name="anonymousTypeObject">匿名对象</param> /// <returns>匿名对象</returns> public static T DeserializeAnonymousType<T>(string json, T anonymousTypeObject) { T t = JsonConvert.DeserializeAnonymousType(json, anonymousTypeObject); return t; } }
复制代码


发布于: 2021 年 03 月 03 日阅读数: 15
用户头像

happlyfox

关注

公众号 程序员工具集 2021.02.18 加入

博客 [www.zhouhuibo.club] 分享优秀的开源项目、学习资源和常用工具。谈论新闻热点、职场经验、学习感悟。共同进步!

评论

发布
暂无评论
c#包含日志输出的项目搭建