前言 一个完整的项目工程离不开日志文件的记录,而记录文件的方法也有很多,可以自己通过Stream去实现文件的读写来完成日志记录,但是如果有个好的封装类库,那为什么不去用呢?
.net日志记录,NLog,log4都可以,用什么都可以,根据自己喜好,我常用log4,所以这里还是介绍Log4的引用及用法。
log4net 这个log4从开发到现在,从netframework开始用,一个config文件就够了,NLog没用过,但是应该都是大差不差,毕竟名字都这么相似嘛(手动滑稽)
依然是,NuGet引用第三方类库 工具->NuGet包管理器->管理解决方案的NuGet程序包… 在浏览中查找”log4”,选择项目工程,点击安装。 安装完成后,依然是来Startup.cs,这次在构造函数直接声明实例化。
1 2 3 4 5 6 7 8 9 10 11 12 public Startup (IConfiguration configuration ) { Configuration = configuration; repository = LogManager.CreateRepository("AprilLog" ); XmlConfigurator.Configure(repository, new FileInfo("Config/log4net.config" )); BasicConfigurator.Configure(repository); } public static ILoggerRepository repository { get ; set ; }
配置文件的创建可以在工程目录下新建一个config文件,配置信息如下,需要标注的信息基本上都在文件注释中,不过多阐述:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <?xml version="1.0" encoding="utf-8" ?> <configuration > <log4net debug ="false" > <appender name ="RollingLogFileAppender" type ="log4net.Appender.RollingFileAppender" > <lockingModel type ="log4net.Appender.FileAppender+MinimalLock" /> <file value ="logs/" /> <appendToFile value ="true" /> <rollingStyle value ="Composite" /> <staticLogFileName value ="false" /> <datePattern value ="yyyyMMdd'.log'" /> <maxSizeRollBackups value ="10" /> <maximumFileSize value ="10MB" /> <layout type ="log4net.Layout.PatternLayout" > <conversionPattern value ="%date [%thread] %-5level %logger - %message%newline" /> </layout > </appender > <root > <level value ="ALL" /> <appender-ref ref ="RollingLogFileAppender" /> </root > </log4net > </configuration >
创建完成后,还是要对比下你的配置文件目录与实际目录是否一致。 OK,全部确认完成后,可以在需要用到Log的地方,添加以下代码:
1 2 3 private ILog log = LogManager.GetLogger(Startup.repository.Name, "Name" );… log.Info("测试" );
例如我们继续拿Values这个控制器开刀。
写好之后我们运行代码,运行后我们可以看到工程目录已经有了logs这个文件夹,打开日志文件。 这样我们就可以在日常使用中记录日志,方便调试记录,追踪问题所在。
整合LogUtil 我这个人比较懒,并且我也不需要关心它是在哪运行,我只想要记录的时候调用下方法,所以对日志记录做了封装调整。
首先,新建类库工程,Apirl.Util(这个工程应该刚开始都创建的-,-||)。 类库工程新建完成的第一件事,干掉Class.cs(我要这示例有何用)
将log4net通过NuGet引入Util工程,过程不过多说了,引用的介绍已经可以了。
引用完成后,在WebApi工程引入Util。 选中Util这个类库工程。
题外话,其实NuGet引入第三方类库在一个项目工程即可,其他工程只要引用对应的项目工程,也可以使用对应的第三方类库,即我在Util引入log4,我就没必要在WebApi工程再引入,这里只是为了讲解说明。
新建LogUtil这个类,代码如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 public class LogUtil { private static readonly ILog log = LogManager.GetLogger("AprilLog" , typeof (LogUtil)); public static void Debug (string msg, object obj = null ) { if (log.IsDebugEnabled && !string .IsNullOrEmpty(msg)) { if (obj == null ) { log.Debug(msg); } else { log.DebugFormat(msg, obj); } } } public static void Info (string msg, object obj = null ) { if (log.IsInfoEnabled && !string .IsNullOrEmpty(msg)) { if (obj == null ) { log.Info(msg); } else { log.InfoFormat(msg, obj); } } } public static void Error (string msg, object obj = null ) { if (log.IsErrorEnabled && !string .IsNullOrEmpty(msg)) { if (obj == null ) { log.Error(msg); } else { log.ErrorFormat(msg, obj); } } } public static void Fatal (string msg, object obj = null ) { if (log.IsFatalEnabled && !string .IsNullOrEmpty(msg)) { if (obj == null ) { log.Fatal(msg); } else { log.FatalFormat(msg, obj); } } } }
下完之后,继续ValuesController(Why一直是这),更改代码如下: 运行看下效果。
小结 封装的好处是为了省事,哪里需要写(点)哪里,咳咳,日志的重要性在代码里面不言而喻,没有日志的工程是不健全的,程序猿可以不会写逻辑,不去考虑架构,不去优化性能,但是日志的记录,代码的注释是不可或缺的,毕竟如果想活着,这两个地方还是多注意吧。
下一节,开始缓存机制 。