一、定义配置文件
可以使用两种方式写配置文件
1、在程序的配置文件里,如AssemblyName.config 或web.config.
需要添加
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net-net-1.0"/>
</configSections>
2、在你自己的文件里。文件名可以是任何你想要的名字,如Log4Net.xml等.
<log4net>
<root>
<level value="WARN" />
<appender-ref ref="LogFileAppender" />
<appender-ref ref="ConsoleAppender" />
</root>
<logger name="testApp.Logging">
<level value="DEBUG"/>
</logger>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender" >
<param name="File" value="log-file.txt" />
<param name="AppendToFile" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="[Header]\r\n"/>
<param name="Footer" value="[Footer]\r\n"/>
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="WARN" />
</filter>
</appender>
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
</layout>
</appender>
</log4net>
二、配置文件详解
1、log4net
所有的配置都要在log4net元素里定义。
1)支持的属性:
debug:可选,取值是true或false,默认是false。设置为true,开启log4net的内部调试。
update:可选,取值是Merge(合并)或Overwrite(覆盖),默认值是Merge。设置为Overwrite,在提交配置的时候会重置已经配置过的库。
threshold:可选,取值是repository(库)中注册的level,默认值是ALL。
2)支持的子元素:
appender:0或多个
logger:0或多个
renderer:0或多个
param:0或多个
root:最多一个
2、root
实际上就是一个根logger,所有其它logger都默认继承它,如果配置文件里没有显式定义,则框架使用根日志中定义的属性。root元素没有属性。
支持的子元素:
appender-ref:0个或多个,要引用的appender的名字。
level:最多一个。 只有在这个级别或之上的事件才会被记录。
param:0个或多个, 设置一些参数。
3、logger
在配置文件appender中的配置好了输出的介质,格式,过滤方式,还要定义日志对象logger。
在框架的体系里,所有的日志对象都是根日志(root logger)的后代。 因此如果一个日志对象没有在配置文件里显式定义,则框架使用根日志中定义的属性。在root标签里,可以定义level级别值和Appender的列表。如果没有定义LEVEL的值,则缺省为DEBUG。可以通过appender-ref标签定义日志对象使用的Appender对象。appender-ref声明了在其他地方定义的Appender对象的一个引用。在一个logger对象中的设置会覆盖根日志的设置。而对Appender属性来说,子日志对象则会继承父日志对象的Appender列表。这种缺省的行为方式也可以通过显式地设定logger标签的additivity属性为false而改变。
root不显式申明时使用默认的配置。我觉得在使用时不定义root,自定义多个logger,在程序中记录日志时直接使用logger的name来查找相应的logger,这样更灵活一些。
例如:
<!--同时写两个文件和数据库-->
<logger name="ReflectionLayout">
<level value="DEBUG"/>
<appender-ref ref="HashtableLayout"/>
<appender-ref ref="ReflectionLayout"/>
<appender-ref ref="ADONetAppender"/>
</logger>
1)支持的属性:
name:必须的,logger的名称
additivity:可选,取值是true或false,默认值是true。设置为false时将阻止父logger中的appender。
2)支持的子元素:
appender-ref:0个或多个,要引用的appender的名字。
level:最多一个。 只有在这个级别或之上的事件才会被记录。
param:0个或多个, 设置一些参数。
4、appender
定义日志的输出方式,只能作为 log4net 的子元素。name属性必须唯一,type属性必须指定。
1)支持的属性:
name:必须的,Appender对象的名称
type:必须的,Appender对象的输出类型
2)支持的子元素:
appender-ref:0个或多个,允许此appender引用其他appender,并不是所以appender类型都支持。
filter:0个或多个,定义此app使用的过滤器。
layout:最多一个。定义appender使用的输出格式。
param:0个或多个, 设置Appender类中对应的属性的值。
实际上所能包含的子元素远不止上面4个。
5、layout
布局,只能作为appender的子元素。
1)支持的属性:
type:必须的,Layout的类型
param:0个或多个, 设置一些参数。
6、filter
过滤器,只能作为appender的子元素。
1)支持的属性:
type:必须的,Filter的类型
2)支持的子元素:
param:0个或多个, 设置一些参数。
7、param
param元素可以是任何元素的子元素。
1)支持的属性:
name:必须的,取值是父对象的参数名。
value:可选的,value和type中,必须有一个属性被指定。value是一个能被转化为参数值的字符串。
type:可选的,value和type中,必须有一个属性被指定。type是一个类型名,如果type不是在log4net程序集中定义的,就需要使用全名。
2)支持的子元素:
param:0个或多个, 设置一些参数。