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