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的好处是既可以不同级别不同的文件夹,还可以在日志里打印类名和方法名。