C# Log4net配置文件 总结

前言

因为项目日志太杂乱而且很大,打开一个就卡死了,何况用户电脑也扛不住日志积累,要做一个日志记录器管理日志。但对里面的配置有一些不熟悉(毕竟都是复制粘贴的),所以记录一下各个项的作用。方便后续复习。

1.0 使用配置文件

众所周知,如果要使用一个配置文件,则需要声明: [assembly: log4net.Config.XmlConfigurator(Watch = true)]

可以放在 AssemblyInfo.cs文件中,也可以放在代码内,如下代码目的是把日志输出到控制台上。

using log4net; using System; [assembly: log4net.Config.XmlConfigurator(Watch = true)] namespace ConsoleApp1 {     class Program     {         static void Main(string[] args)         {             ILog log = log4net.LogManager.GetLogger("Test");             log.Error("错误", new Exception("发生了一个异常"));//错误             log.Fatal("严重错误", new Exception("发生了一个致命错误"));//严重错误             log.Info("信息"); //记录一般信息             log.Debug("调试信息");//记录调试信息             log.Warn("警告");//记录警告信息             Console.WriteLine("日志记录完毕。");             Console.Read();         }     } }

其中配置文件放在 App.config

<?xml version="1.0" encoding="utf-8" ?> <configuration>    <configSections>     <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>   </configSections>   <log4net>     <appender name="控制台输出" type="log4net.Appender.ConsoleAppender">       <layout type="log4net.Layout.PatternLayout">         <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"  />       </layout>     </appender>     <logger name="Test">       <level value="ALL"/>       <appender-ref ref="控制台输出" />     </logger>   </log4net>    <startup>          <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />     </startup> </configuration>

在很多demo上,也有 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)],实际上都是差不多,意思是 使用一个叫 log4net.config,后缀名为 config配置文件。

2 配置文件内容介绍

2.1 logger.level

通过上面简单的配置文件,可以发现是通过一个叫 <logger name="Test">来控制的。那么可以通过如下代码找到它。这个 ILog就提供了一堆方法(Error,Info...)让我们使用。

ILog log = log4net.LogManager.GetLogger("Test");

<logger name="Test">内部还有一个 <level value="ALL"/>,就是日志的记录等级 由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF,那么这个ALL就是什么都输出。如果把等级改为 WARN。那么上面代码输出如下,很明显,DEBUG|INFO已经失效了。

C# Log4net配置文件 总结

2.1 logger.appender

上文给出的demo是针对控制台输出的,那么它是怎么控制的呢。这个时候就需要  <appender-ref ref="控制台输出" />和它名字下的一起控制了

<appender name="控制台输出" type="log4net.Appender.ConsoleAppender">     <layout type="log4net.Layout.PatternLayout">         <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"  />     </layout> </appender>

其中type还有很多类型。这里就说几个常用的。

ConsoleAppender在控制台写日志

ColoredConsoleAppender 额,名字有点直白,就是控制台输出的还有颜色

FileAppender往文件里面写日志

RollingFileAppender基于FileAppender,不过它可以管理文件大小之类的。

具体的例子我们以后再看。

2.2 logger.layout

到这里就是控制记录格式了。其中常用的是 <layout type="log4net.Layout.PatternLayout">,通过标识符来控制格式,以下是一些解释

%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息  %n(new line):换行  %d(datetime):输出当前语句运行的时刻  %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数  %t(thread id):当前语句所在的线程ID  %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等  %c(class):当前日志对象的名称

2.3 logger.filter

接下来,我们来点复杂的配置 <filter type="log4net.Filter.LevelRangeFilter">,为了避免看走神,我们把配置文件再展示一次。加入这个类似于过滤,意思是只有等级区间内INFO|WARN|ERROR的才可以输出。

<?xml version="1.0" encoding="utf-8" ?> <configuration>    <configSections>     <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>   </configSections>   <log4net>     <appender name="控制台输出" type="log4net.Appender.ConsoleAppender">       <layout type="log4net.Layout.PatternLayout">         <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"  />       </layout>       <filter type="log4net.Filter.LevelRangeFilter"> 	    <param name="LevelMin" value="INFO" /> 	    <param name="LevelMax" value="ERROR" />       </filter>     </appender>     <logger name="Test">       <level value="ALL"/>       <appender-ref ref="控制台输出" />     </logger>   </log4net>    <startup>          <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />     </startup> </configuration>

2.4 root

可以把它看做是根logger,如果没有显示定义logger,那么使用根日志定义的属性。

<root>     <level value="ALL" />     <appender-ref ref="控制台输出" /> </root>

2.4 综合使用

现在已经了解基础配置了,快来试一试复杂的配置吧

<?xml version="1.0" encoding="utf-8"?> <configuration>    <configSections>     <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>   </configSections>   <log4net> 	  <appender name="SysAppender" type="log4net.Appender.RollingFileAppender"> 		  <!--日志路径--> 		  <File value="Log\"/> 		  <!--是否是向文件中追加日志--> 		  <AppendToFile value="true"/> 		  <!--创建新文件的方式--> 		  <param name="RollingStyle" value="Date"/> 		  <!--日志文件名--> 		  <param name="DatePattern" value="yyyy-MM-dd&quot;.log&quot;"/> 		  <!--log文件大小--> 		  <MaximumFileSize value="1024"/> 		  <!--备份日志数目--> 		  <MaxSizeRollBackups value="30"/> 		  <!--日志文件名是否是固定不变的--> 		  <StaticLogFileName value="false"/> 		  <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--> 		  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 		  <!--输出格式--> 		  <layout type="log4net.Layout.PatternLayout"> 			  <!--日期 [级别]--> 			  <conversionPattern value="%d [%-5p] [%t%] -%m%n"/> 		  </layout> 		  <!--控制器,只记录级别在INFO-INFO之间的信息--> 		  <filter type="log4net.Filter.LevelRangeFilter"> 			  <param name="LevelMin" value="ALL" /> 			  <param name="LevelMax" value="OFF" /> 		  </filter> 	  </appender>     <logger name="Test"> 	    <level value="ALL"/>         <appender-ref ref="SysAppender"/>     </logger>   </log4net>    <startup>          <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>     </startup> </configuration>

3.0 通过代码获取配置信息

除了 log4net.LogManager.GetLogger("Test");还有一种可以获取以上配置信息 Repository

using System;  [assembly: log4net.Config.XmlConfigurator(Watch = true)] namespace ConsoleApp1 {     class Program     {         static void Main(string[] args)         {             log4net.Repository.Hierarchy.Hierarchy hier =                 (log4net.Repository.Hierarchy.Hierarchy)log4net.LogManager.GetRepository();              var logs = hier.GetCurrentLoggers();              //输出logger名称             foreach (var logger in logs)             {                 Console.WriteLine(logger.Name);             }              //输出appenders名称             var appenders = hier.GetAppenders();             foreach (var appender in appenders)             {                 Console.WriteLine(appender.Name);             }              Console.Read();         }     } }

参考链接

log4net文档

C# log4net 配置

C#中log4net使用方法(一)

log4net面面观之工作原理

log4net面面观之Repository

 

发表评论

相关文章