Log4net配置与使用简要说明

时间:2021-05-21 14:51:30

log4net详细配置:
http://logging.apache.org/log4net/
本文描述如有错误,以官网的说明为准;p

一:先来看看log4net中的几个概念:

1. log4net继承机制

log4net通过logger的名字与"."符号来体现继承层次,类似于c#的命名空间,例如:

var loggerA=LogManager.GetLogger("a");
var loggerB=LogManager.GetLogger("a.b");

那么,loggerB继承了loggerA,如果没有为loggerB指定appender或者level,将会使用loggerB的appender或者level. by the way,另一个获取logger的方法:GetLogger(typeof(SomeClass))会新建一个名为"SomeClass"的logger

2. appender

appender:负责将log写入何处。log4net中内置了很多种appnder:
FileAppender:将log写入文件中。
RollingFileAppender:将log写入到文件中,并可以按某些条件(例如按日期或者按文件大小)来划分不同文件,例如希望每天一个log文件,或者每个文件1M等等。
AdoNetAppender:将log通过ado.net写入到数据库。
ConsoleAppender:将log输出到console中。
log4net中内置了非常多的appender,详细请参考:
http://logging.apache.org/log4net/release/manual/introduction.html

3. Level

level是指日志级别,日志级别从低到高分为:
ALL
DEBUG --调试
INFO --信息
WARN --警告
ERROR --错误
FATAL --致命
OFF

一个logger只会记录级别比这个logger设定的级别要大的log,例如,一个logger的级别为ERROR(如何设定logger的日志级别会在下面提及),当 logger.Info("this's a log of info level")时,log将不会被记录,因为logger以Info()方法记录该log,意味着该log的级别是INFO,但logger的级别是ERROR,大于INFO,所以不会记录该log。但logger.Error("this's a log of error level")或者logger.Fatal("this's a log of fatal level")时,则会记录该log。

4. Filter

filter代表appender的过滤器,可以设置appender以某种方式过滤(不记录)日志。例如,LevelMatchFilter用于设定只记录某个级别的日志,StringMatchFilter用于设定只记录日志里包含某些字眼的日志。
如何设置Filter将会在下面提及,但更多的Filter用法请参考:http://logging.apache.org/log4net/release/manual/configuration.html

5. Layout

layout用于设置日志的排版格式。(这个通常用默认的,比较少自己配置,不懂~ 具体请看:http://logging.apache.org/log4net/release/manual/configuration.html

二: 如何配置log4net

log4net支持在代码中设定logger(appender,level,filter等),但推荐通过配置文件来进行配置。
配置文件的方式也分为2种:

1.在项目的配置文件中(web.config,app.config)中添加配置节来实现

2.指定一个独立的配置文件的方式来配置。

在项目配置文件中进行配置和使用步骤:

a.先在项目配置文件中定义一个配置节:

  <configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>

b.然后在项目配置文件中添加"log4net"配置节:

<log4net>
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\LogError\\" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="100" />
<param name="ConversionPattern" value="%n异常时间:%d [%t] %n异常级别:%-5p %n异 常 类:%c [%x] %n%m %n " />
</layout>
</appender>
<root>
<level value="ERROR" />
<appender-ref ref="ErrorAppender" />
</root>
</log4net>

c.调用 XmlConfigurator.Configure()方法启用配置,或者使用[assembly: log4net.Config.XmlConfigurator()] 特性来启用配置(log4net推荐使用程序集特性的方式来进行配置。只需要在项目的Properties/AssemblyInfo.cs中添加该程序集特性即可)

指定一个独立的配置文件步骤:

a.在项目根目录中(根目录是默认位置,但可以指定其他位置,这里不作说明;p)新建一个任意文件名的xml文件,例如"log4net.config"。
b.在该xml文件中进行配置,xml文件的内容和上一种配置方式的log4net配置节一样,只是单独放到一个xml文件中而已。
c.调用XmlConfigurator.ConfigureAndWatch()方法启用配置,或者使用[assembly: log4net.Config.XmlConfigurator()] 特性来启用配置。

三:配置文件大概解释(只是常用的,大概的描述,具体的请参考官网)

<log4net>
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\LogError\\" /> <!--基于应用的根目录-->
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="100" />
<param name="MaxFileSize" value="10240" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyy-MM-dd.log" /><!--日志文件的风格,例如这个就是'2017-02-21.log'-->
<param name="RollingStyle" value="Date" />
<param name="Encoding" value="UTF-8" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%n异常时间:%d [%t] %n异常级别:%-5p %n异 常 类:%c [%x] %n%m %n " /><!--日志内容的显示排版风格,但不好意思,各个参数我也没去研究是什么意思,我自己都是用惯这样的排版-->
</layout>
</appender>
<appender name="MyConsoleAppender" type="log4net.Appender.ConsoleAppender" ><!--这里定义一个名叫"MyConsoleAppender"的,类型为ConsoleAppender的appender,可以被下边的logger所使用-->
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
</layout>
<filter type="log4net.Filter.StringMatchFilter"><!--过滤器,匹配包含某些字符的log-->
<stringToMatch value="stringToMatch" />
</filter>
</appender>
<root><!--设定log4net继承层次中的根logger,相似于c#中的object,所有的logger会继承root的配置-->
<level value="INFO" />
<appender-ref ref="ConsoleAppender" /><!--指定根logger默认使用"MyConsoleAppender"-->
</root>
<logger name="SomeLoggerFoo"><!--未某个具体名字的logger进行配置,例如在代码中 LogManager.GetLogger("SomeLoggerFoo"),那么该logger就会使用这个配置-->
<level value="INFO" />
<appender-ref ref="ConsoleAppender" /> <!--指定使用哪个appnder-->
</logger>
<logger name="myErrorAppender">
<level value="ERROR" />
<appender-ref ref="ErrorAppender" />
</logger>
</log4net>

以上是log4net比较粗略的配置和使用说明,如果需要更详细的信息,请参考log4net官网:

http://logging.apache.org/log4net/

水平有限难免有误敬请指正