log4net 配置文档

log4net 经常使用,总是只为了生成日志,没有过深的研究,把使用中遇到的问题总结一下,以便参考:

1、<logger>相当于<root>的子集,自定义级别或名称时使用,在logger中执行过的,会在root里重复执行。

 

2、log4net.Filter.LoggerMatchFilter和log4net.Filter.LevelRangeFilter

log4net.Filter.LevelRangeFilter:日志级别范围限制

log4net.Filter.LoggerMatchFilter:实例化ILog时用的名称过滤

 

3、给不同的级别定义不同的路径,亲测了两种方法,均可使用。

a、用名称实例化ILog,Appender中可以用log4net.Filter.LoggerMatchFilter和log4net.Filter.LevelRangeFilter的一起限制配合

代码如下:

            var logTypeName = "ErrorLog";
            ILog log = LogManager.GetLogger(logTypeName);
            log.Error("Error日志内容");

            logTypeName = "DebugLog";
            log = LogManager.GetLogger(logTypeName);
            log.Debug("Debug日志内容");

关键配置也可以两种写法,第一种配置如下(用logger来引导,Appender中用log4net.Filter.LoggerMatchFilter限制j是ErrorLog还是DebugLog,用log4net.Filter.LevelRangeFilter来限制日志级别【根据需要】):


  <appender name="rollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="Log/log" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <rollingStyle value="Date" />
    <datePattern value="yyyy-MM-dd&quot;.log&quot;" />
    <maxSizeRollBackups value="20" />
    <maximumFileSize value="3MB" />
    <staticLogFileName value="false" />
    <!--日志级别过滤-->
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="INFO" />
      <param name="LevelMax" value="WARN" />
    </filter>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
    </layout>
  </appender>

  <appender name="ErrorLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="Log/Error/log" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <rollingStyle value="Date" />
    <datePattern value="yyyy-MM-dd&quot;.log&quot;" />
    <maxSizeRollBackups value="100" />
    <maximumFileSize value="100MB" />
    <staticLogFileName value="false" />
    <!--日志级别过滤-->
    <!--<filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="ERROR" />
      <param name="LevelMax" value="ERROR" />
    </filter>-->
    <!--输出自定义级别的日志(自定义级别LogManager.GetLogger("ErrorLog"))-->
    <filter type="log4net.Filter.LoggerMatchFilter">
      <loggerToMatch value="ErrorLog" />
    </filter>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
    </layout>
  </appender>

  <appender name="DebugLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="Log/Debug/log" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <rollingStyle value="Date" />
    <datePattern value="yyyy-MM-dd&quot;.log&quot;" />
    <maxSizeRollBackups value="100" />
    <maximumFileSize value="100MB" />
    <staticLogFileName value="false" />
    <!--日志级别过滤-->
    <!--<filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="DEBUG" />
      <param name="LevelMax" value="DEBUG" />
    </filter>-->
    <!--输出自定义级别的日志(自定义级别LogManager.GetLogger("DebugLog"))-->
    <filter type="log4net.Filter.LoggerMatchFilter">
      <loggerToMatch value="DebugLog" />
    </filter>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
    </layout>
  </appender>

  
  <!--ERROR级别引用ErrorLogFileAppender-->
  <logger name="ErrorLog">
    <level value="ERROR"/>    <!--实测没什么作用-->
    <appender-ref ref="ErrorLogFileAppender"/>
  </logger>

  <!--DEBUG级别引用DebugLogFileAppender-->
  <logger name="DebugLog">
    <level value="DEBUG"/>    <!--实测没什么作用-->
    <appender-ref ref="DebugLogFileAppender"/>
  </logger>
  
  <!-- levels: OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL -->
  <root>
    <priority value="ALL"/>
    <level value="ALL"/>
    <appender-ref ref="rollingFileAppender" />
    <appender-ref ref="ConsoleAppender" />
  </root>

此种方法中,先定义不同的级别名称,用名称实例化ILog,然后在配置表中增加logger节点(logger上的name属性和实例化ILog的名称要匹配),引向不同的Appender,最后在Appender节点里,主要通过log4net.Filter.LoggerMatchFilter进行过滤。

注:如果只有一个logger节点引用Appender的话,当前Appender里的log4net.Filter.LoggerMatchFilter可以省略。

 

    <!--输出自定义级别的日志(自定义级别LogManager.GetLogger("ErrorLog"))-->
    <filter type="log4net.Filter.LoggerMatchFilter">
      <loggerToMatch value="ErrorLog" />
    </filter>

 

第二种配置如下(通用root来引导。root节点与Appender中log4net.Filter.LevelRangeFilter的配合):


  <appender name="rollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="Log/log" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <rollingStyle value="Date" />
    <datePattern value="yyyy-MM-dd&quot;.log&quot;" />
    <maxSizeRollBackups value="20" />
    <maximumFileSize value="3MB" />
    <staticLogFileName value="false" />
    <!--日志级别过滤-->
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="INFO" />
      <param name="LevelMax" value="WARN" />
    </filter>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
    </layout>
  </appender>

  <appender name="ErrorLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="Log/Error/log" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <rollingStyle value="Date" />
    <datePattern value="yyyy-MM-dd&quot;.log&quot;" />
    <maxSizeRollBackups value="100" />
    <maximumFileSize value="100MB" />
    <staticLogFileName value="false" />
    <!--日志级别过滤-->
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="ERROR" />
      <param name="LevelMax" value="ERROR" />
    </filter>
    <!--输出自定义级别的日志(自定义级别LogManager.GetLogger("ErrorLog"))-->
    <!--<filter type="log4net.Filter.LoggerMatchFilter">
      <loggerToMatch value="ErrorLog" />
    </filter>-->
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
    </layout>
  </appender>

  <appender name="DebugLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="Log/Debug/log" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <rollingStyle value="Date" />
    <datePattern value="yyyy-MM-dd&quot;.log&quot;" />
    <maxSizeRollBackups value="100" />
    <maximumFileSize value="100MB" />
    <staticLogFileName value="false" />
    <!--日志级别过滤-->
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="DEBUG" />
      <param name="LevelMax" value="DEBUG" />
    </filter>
    <!--输出自定义级别的日志(自定义级别LogManager.GetLogger("DebugLog"))-->
    <!--<filter type="log4net.Filter.LoggerMatchFilter">
      <loggerToMatch value="DebugLog" />
    </filter>-->
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
    </layout>
  </appender>


  <!--ERROR级别引用ErrorLogFileAppender-->
  <!--<logger name="ErrorLog">
    <level value="ERROR"/>
    <appender-ref ref="ErrorLogFileAppender"/>
  </logger>-->

  <!--DEBUG级别引用DebugLogFileAppender-->
  <!--<logger name="DebugLog">
    <level value="DEBUG"/>
    <appender-ref ref="DebugLogFileAppender"/>
  </logger>-->


  <!-- levels: OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL -->
  <root>
    <priority value="ALL"/>
    <level value="ALL"/>
    <appender-ref ref="FatalLogFileAppender"/>
    <appender-ref ref="ErrorLogFileAppender"/>
    <appender-ref ref="rollingFileAppender" />
    <appender-ref ref="ConsoleAppender" />
  </root>

此种配置方法使用日志级别范围来进行限制(log4net.Filter.LevelRangeFilter),而不再使用log4net.Filter.LoggerMatchFilter(Root的方式下,这个不起作用),同时也省略了logger的节点的使用,统一由Root节点完处理, 然后在Appender里进行过滤。如下:

    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="ERROR" />
      <param name="LevelMax" value="ERROR" />
    </filter>
    <!--输出自定义级别的日志(自定义级别LogManager.GetLogger("ErrorLog"))-->
    <!--<filter type="log4net.Filter.LoggerMatchFilter">
      <loggerToMatch value="ErrorLog" />
    </filter>-->

用名称实例化ILog方法的不足点是,生成的日志里不能显示类名和方法名,而以“ErrorLog”来代替类名和方法名。

 

b、用类型实例化ILog,Appender中可以用log4net.Filter.LevelRangeFilter的限制配合

            //伪代码
            ILog log = LogManager.GetLogger(Type);
            log.Error("Error日志内容");
            log.Debug("Debug日志内容");

关键配置如上述的第二种即可,root节点与Appender中log4net.Filter.LevelRangeFilter的配合:如下(已去除注释掉的配置)


  <appender name="rollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="Log/log" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <rollingStyle value="Date" />
    <datePattern value="yyyy-MM-dd&quot;.log&quot;" />
    <maxSizeRollBackups value="20" />
    <maximumFileSize value="3MB" />
    <staticLogFileName value="false" />
    <!--日志级别过滤-->
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="INFO" />
      <param name="LevelMax" value="WARN" />
    </filter>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
    </layout>
  </appender>

  <appender name="ErrorLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="Log/Error/log" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <rollingStyle value="Date" />
    <datePattern value="yyyy-MM-dd&quot;.log&quot;" />
    <maxSizeRollBackups value="100" />
    <maximumFileSize value="100MB" />
    <staticLogFileName value="false" />
    <!--日志级别过滤-->
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="ERROR" />
      <param name="LevelMax" value="ERROR" />
    </filter>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
    </layout>
  </appender>

  <appender name="DebugLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="Log/Debug/log" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <rollingStyle value="Date" />
    <datePattern value="yyyy-MM-dd&quot;.log&quot;" />
    <maxSizeRollBackups value="100" />
    <maximumFileSize value="100MB" />
    <staticLogFileName value="false" />
    <!--日志级别过滤-->
    <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="DEBUG" />
      <param name="LevelMax" value="DEBUG" />
    </filter>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/>
    </layout>
  </appender>


  <!-- levels: OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL -->
  <root>
    <priority value="ALL"/>
    <level value="ALL"/>
    <appender-ref ref="FatalLogFileAppender"/>
    <appender-ref ref="ErrorLogFileAppender"/>
    <appender-ref ref="rollingFileAppender" />
    <appender-ref ref="ConsoleAppender" />
  </root>

用类型实例化ILog的好处是既可以不同级别不同的文件夹,还可以在日志里打印类名和方法名。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章