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的好處是既可以不同級別不同的文件夾,還可以在日誌裏打印類名和方法名。

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