Log4Net配置
首先引用log4net.dll或者通过Nuget安装log4net。
程序启动时需要读取log4net的配置文件。
可以直接配置到app.config文件中,也可以另新建一个文件来存储log4net配置信息。
如果是直接配置到App.config中时,直接调用log4net.Config.XmlConfigurator.Configure();
如果是另新建一个文件:log4net.Config.XmlConfigurator.Configure(new FileInfo("log4net.config"));
这里放上我再一个应用中的配置,采用的是另外新建文件。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4Net" />
</configSections>
<log4net >
<!--配置日志的级别,低于此级别的就不写到日志里面去
OFF、FATAL、ERROR, WARN, INFO, DEBUG, ALL
-->
<root>
<level value="DEBUG" />
<appender-ref ref="DebugAppender" />
<appender-ref ref="InfoAppender" />
<appender-ref ref="ErrorAppender" />
<appender-ref ref="ConsoleAppender" />
</root>
<logger name="WebLogger">
<level value="ERROR" />
</logger>
<!--输出控制台-->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender,log4net">
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c - (%line) %m%n" />
</layout>
</appender>
<appender name="DebugAppender" type="log4net.Appender.RollingFileAppender,log4net" >
<param name="File" value="Log/DEBUG/" />
<param name="AppendToFile" value="true" />
<param name="MaximumFileSize" value="10MB"/>
<param name="MaxSizeRollBackups" value="31" />
<param name="RollingStyle" value="Composite" />
<param name="DatePattern" value=""Log_"yyyyMMdd"----Debug.txt"" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="Header" value="
----------------------application startup V1.00--------------------------
" />
<param name="Footer" value="
 ----------------------application shutdown--------------------------
" />
<param name="ConversionPattern" value="%d [%t] %-5p %c - (%line) %m%n" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="Debug" />
<param name="LevelMax" value="Debug" />
</filter>
</appender>
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender,log4net" >
<param name="File" value="Log/Info/" />
<param name="AppendToFile" value="true" />
<param name="MaximumFileSize" value="10MB"/>
<param name="MaxSizeRollBackups" value="31" />
<param name="RollingStyle" value="Composite" />
<param name="DatePattern" value=""Log_"yyyyMMdd"----Info.txt"" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="Header" value="
----------------------application startup V1.00--------------------------
" />
<param name="Footer" value="
 ----------------------application shutdown--------------------------
" />
<param name="ConversionPattern" value="%d [%t] %-5p %c - (%line) %m%n" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="INFO" />
</filter>
</appender>
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender,log4net" >
<param name="File" value="Log/Error/" />
<param name="AppendToFile" value="true" />
<param name="MaximumFileSize" value="10MB"/>
<param name="MaxSizeRollBackups" value="31" />
<param name="RollingStyle" value="Composite" />
<param name="DatePattern" value=""Log_"yyyyMMdd"----Error.txt"" />
<param name="StaticLogFileName" value="false" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="Header" value="
----------------------application startup V1.00--------------------------
" />
<param name="Footer" value="
 ----------------------application shutdown--------------------------
" />
<param name="ConversionPattern" value="%d [%t] %-5p %c - (%line) %m%n" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="OFF" />
</filter>
</appender>
</log4net>
</configuration>
在程序中使用:
log4net.ILog log = log4net.LogManager.GetLogger("test");
log.Info("同一个世界");
Log4Net的主要组成部分
Appenders
Appenders用来定义日志的输出方式,即日志要写到哪种介质上去。较常用的Log4Net已经实现好了,直接在配置文件中调用就可以了;当然也可以自己写一个,需要从log4net.Appender.AppenderSkeleton类继承。它还可以通过配置Filters和Layout来实现日志的过滤和输出格式。
已经实现的输出方式有:
AdoNetAppender将日志记录到数据库中。可以采用SQL和存储过程两种方式。
AnsiColorTerminalAppender将日志高亮输出到ANSI终端。
AspNetTraceAppender能用Asp.net中Trace的方式查看记录的日志。
BufferingForwardingAppender在输出到子Appenders之前先缓存日志事件。
ConsoleAppender将日志输出到应用程序控制台。
EventLogAppender将日志写到Windows Event Log.
FileAppender将日志输出到文件。
ForwardingAppender发送日志事件到子Appenders。
LocalSyslogAppender将日志写到local syslog service(仅用于Unix环境下)
MemoryAppender将日志存到内存缓冲区。
NetSendAppender将日志输出到Window Messager service。这些日志信息将在用户终端的对话框中显示。
OutputDebugStringAppender将日志输出到Debuger,如果程序没有Debuger,就输出到系统Debuger。如果系统Debuger也不可用,将忽略消息。
RemoteSyslogAppender通过UDP网络协议将日志写到Remote syslog service。
RemotingAPpender通过.net Remoting将日志写到远程接收端。
RollingFileAppender将日志以回滚文件的形式写到文件中。
SmtpAppender将日志写到邮件中。
SmtpPickupDirAppender将消息以文件的方式放入一个目录中。
TelnetAppender客户端通过Telnet来接收日志事件。
TraceAppender将日志写到.net trace系统。
UdpAppender将日志以无连接UDP数据报的形式发送到远程。
Filters
使用过滤器可以过滤掉Appender输出的内容。过滤器通常有以下几种:
DenyAllFilter阻止所有的日志事件被记录。
LevelMatchFilter只有指定等级的日志事件才被记录。
LevelRangeFilter日志等级在指定范围内的事件才被记录。
LoggerMatchFilter与Logger名称匹配,才记录。
PropertyFilter消息匹配指定的属性值才被记录。
StringMatchFilter消息匹配指定的字符串才被记录。
Layouts
Layout用于控制Appender的输出格式,可以是线性的也可以是XML.
一个Appender只能有一个layout.
最常用的Layout应该是经典格式的PatternLayout,其次是SimpleLayout,RawTimeStampLayout和ExceptionLayout。然后还有IRawLayout,XMLLayout等几个,使用较少。Layout可以自己实现,需要从Log4net.Layout.LayoutSkeleton类继承,来输出一些特殊需要的格式,在后面扩展时就重新实现了一个Layout.
SimpleLayout简单输出格式,只输出日志级别与消息内容。
RawTimeStampLayout用来格式化时间,在向数据库输出时会用到。
格式如:"yyyy-MM-dd HH:mm:ss"
ExceptionLayout需要给LOgger的方法出入Exception独享作为参数才起作用,否则就说明也不输出。输出的时候会包含Message和Trace。
PatterLayout使用最多的一个Layout,能输出的信息很多,使用方式可参见上面例子中的配置文件。
Loggers
Logger是直接和应用程序交互的组件。Logger只是产生日志,然后由它引用的Appender记录到指定的媒介,并由Layout控制输出格式。
Logger提供了多种方式来记录一个日志消息,也可以有多个Logger同时存在。每个实例化的Logger对象对被log4net作为命名实体来维护。log4net使用继承体系,也就是说加入存在两个Logger,名字分别为a.b.c和a.b。那么a.b就是a.b.c的祖先。每个Logger都继承了它祖先的属性。所有的Logger都从Root继承,Root本身也是一个Logger.
日志的等级,它们由高到低分别为:
OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL
高于等级设定值方法都能写入日志,Off所有写入方法都不能写到日志里,ALL则相反。
在具体写日志时,一般可以这样理解日志等级:
FATAL(致命错误):记录系统中出现的能使系统完全失去功能,服务停止,系统崩溃等使系统无法继续运行下去的错误。例如,数据库无法连接,系统出现死循环。
ERROR(一般错误):记录系统中出现的导致系统不稳定,部分功能出现混乱或部分功能失效一类的错误。例如,数据字段为空,数据操作不可完成,操作出现异常等。
WARN(警告):记录系统中不影响系统继续运行,但不符合系统运行正常条件,有可能引起系统错误的信息。例如,记录内容为空,数据内容不正确等。
INFO(一般信息):记录系统运行中应该让用户知道的基本信息。例如,服务开始运行,功能已经开户等。
DEBUG(调试信息):记录系统用于调试的一切信息,内容或者是一些关键内容的输出。
Logger实现的ILog接口,ILog定义了5个方法(Debug,Info,Warn,Error,Fatal)分别对不同的日志等级记录日志。这5个方法还有5个重载。
Object Renders
它将告诉logger如何把一个对象转化为一个字符串记录到日志里。(ILog中定义的接口接收的参数是Object,而不是String)
例如你想把Orange对象记录到日志中,但此时logger只会调用Orange默认的ToString方法而已。所以要定义一个OrangeRender类实现Log4net.ObjectRender.IObjectRender接口,然后注册它。
Repository
Repository主要用于日志对象组织结构的维护。
配置文件详解
配置文件构成
主要有两大部分,一是申明一个名为log4net的自定义配置节,如下所示:
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4Net" />
</configSections>
二是log4net节的具体配置。
所有的配置都要在log4net元素里定义。
支持的属性:
debug | 可选,默认为False,设置为True,开启log4net的内部调试 |
update | 可选,取值是Merge(合并)或Overwrite(覆盖),默认值是Merge.设置为OverWrite,在提交配置的时候会重置已经配置过的库. |
threshold | 可选,取值是repository中注册的level,默认值是All |
支持的子元素:
appender | 0或多个 |
logger | 0或多个 |
renderer | 0或多个 |
root | 最多一个 |
param | 0或多个 |
root
实际上就是一个根logger,所有其它logger都默认继承它,如果配置文件里没有显示定义,则框架使用根日志中定义的属性。root元素没有属性。
支持的子元素:
appender-ref | 0个或多个,要引用的appender的名字 |
level | 最多一个,只有在这个级别或之上的事件才会被记录 |
param | 0个或多个,设置一些参数 |
logger
支持的属性:
name | 必须的,logger的名称 |
additivity | 可选,默认值为True,设置为False时将阻止父logger中的appender |
支持的子元素:
appender-ref | 0个或多个,要引用的appender的名字 |
level | 最多一个,只有在这个级别之上的事件才会被记录 |
param | 0个或多个,设置一些参数 |
appender
定义日志的输出方式,只能作为log4net的子元素。name属性必须唯一,type属性必须指定。
支持的属性:
name | 必须的,appender对象的名称 |
type | 必须的,appender对象的输出类型 |
支持的子元素:
appender-ref | 0个或多个,允许appender引用其他appender,并不是所有appender类型都支持 |
filter | 0个或多个,定义此app使用的过滤器 |
layout | 最多一个,定义appender使用的输出格式 |
param | 0个或多个,设置Appender类中对应的属性的值 |
实际上appender所能包含的子元素远不止上面4个。
layout
布局,只能作为appender的子元素。
支持的属性:
type | 必须的,Layout的类型 |
支持的子元素:
param | 0个或多个,设置一些参数 |
filter
过滤器,只能作为appender的子元素
支持的属性:
type | 必须的,Filter的类型 |
支持的子元素:
param | 0个或多个,设置一些参数 |
param
param元素可以是任何的子元素。
支持的属性:
name | 必须的,取值是父对象的参数名 |
value | 可选的,value和type中,必须有一个属性值被指定。value是一个能被转为参数值的字符串 |
type | 可选的,type是一个类型名,如果type不是在log4net程序集中定义的,就需要使用全名 |
支持的子元素:
param | 0个或多个,设置一些参数 |
appender配置
appender在配置文件中至少有一个,也可以有多个,有些appender类型还可以引用其他appender类型。
写入回滚文件
<appender name="ReflectionLayout" type="log4net.Appender.RollingFileAppender,log4net">
<!--日志文件路径,“/”与“/”作用相同,到达的目录相同,文件夹不存在则新建 -->
<!--按文件大小方式输出时在这里指定文件名,并且当天的日志在下一天时在文件名后自动追加当天日期形成新文件。-->
<!—按照日期形式输出时,直接连接元素DatePattern的value形成文件路径。此处使用这种方式 -->
<!--param的名称,可以直接查对应的appender类的属性名即可,这里要查的就是RollingFileAppender类的属性 -->
<param name="File" value="D:/Log/" />
<!--是否追加到文件-->
<param name="AppendToFile" value="true" />
<!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<!—使用Unicode编码-->
<Encoding value="UTF-8" />
<!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数-->
<param name="MaxSizeRollBackups" value="10" />
<!--是否只写到一个文件中-->
<param name="StaticLogFileName" value="false" />
<!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
<param name="RollingStyle" value="Composite" />
<!--按日期产生文件夹和文件名[在日期方式与混合方式下使用]-->
<!—此处按日期产生文件夹,文件名固定。注意" 的位置-->
<param name="DatePattern" value="yyyy-MM-dd/"ReflectionLayout.log"" />
<!—这是按日期产生文件夹,并在文件名前也加上日期-->
<param name="DatePattern" value="yyyyMMdd/yyyyMMdd"-TimerServer.log"" />
<!—这是先按日期产生文件夹,再形成下一级固定的文件夹—>
<param name="DatePattern" value="yyyyMMdd/"TimerServer/TimerServer.log"" />
<!--每个文件的大小。只在混合方式与文件大小方式下使用。
超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。
可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志-->
<param name="maximumFileSize" value="500KB" />
<!--计数类型为1,2,3…-->
<param name="CountDirection" value="1"/>
<!—过滤设置,LevelRangeFilter为使用的过滤器。 -->
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMax" value="WARN" />
</filter>
<!--记录的格式。一般用log4net.Layout.PatternLayout布局-->
<!—此处用继承了log4net.Layout.PatternLayout的自定义布局,TGLog.ExpandLayout2
为命名空间。%property{Operator}、%property{Action}是自定义的输出-->
<layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
<param name="ConversionPattern"
value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger 操作者ID:%property{Operator} 操作类型:%property{Action}%n 当前机器名:%property%n当前机器名及登录用户:%username %n 记录位置:%location%n 消息描述:%property{Message}%n 异常:%exception%n 消息:%message%newline%n%n" />
</layout>
</appender>
注意这些配置属性有些是可选的,如果需要,一定要写正确,否则要么输出的不是自己想要的结果,要么干脆不输出任何信息。