首先引用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>
在程序中使用:c#
log4net.ILog log = log4net.LogManager.GetLogger("test"); log.Info("同一个世界");
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数据报的形式发送到远程。缓存
使用过滤器能够过滤掉Appender输出的内容。过滤器一般有如下几种:
DenyAllFilter阻止全部的日志事件被记录。
LevelMatchFilter只有指定等级的日志事件才被记录。
LevelRangeFilter日志等级在指定范围内的事件才被记录。
LoggerMatchFilter与Logger名称匹配,才记录。
PropertyFilter消息匹配指定的属性值才被记录。
StringMatchFilter消息匹配指定的字符串才被记录。安全
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,能输出的信息不少,使用方式可参见上面例子中的配置文件。网络
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个重载。多线程
它将告诉logger如何把一个对象转化为一个字符串记录到日志里。(ILog中定义的接口接收的参数是Object,而不是String)
例如你想把Orange对象记录到日志中,但此时logger只会调用Orange默认的ToString方法而已。因此要定义一个OrangeRender类实现Log4net.ObjectRender.IObjectRender接口,而后注册它。app
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或多个|
实际上就是一个根logger,全部其它logger都默认继承它,若是配置文件里没有显示定义,则框架使用根日志中定义的属性。root元素没有属性。
支持的子元素:
|||
|--|--|
|appender-ref|0个或多个,要引用的appender的名字|
|level|最多一个,只有在这个级别或之上的事件才会被记录|
|param|0个或多个,设置一些参数|
支持的属性:
|||
|---|---|
|name|必须的,logger的名称|
|additivity|可选,默认值为True,设置为False时将阻止父logger中的appender|
支持的子元素:
|||
|--|--|
|appender-ref|0个或多个,要引用的appender的名字|
|level|最多一个,只有在这个级别之上的事件才会被记录|
|param|0个或多个,设置一些参数|
定义日志的输出方式,只能做为log4net的子元素。name属性必须惟一,type属性必须指定。
支持的属性:
|||
|--|--|
|name|必须的,appender对象的名称|
|type|必须的,appender对象的输出类型|
支持的子元素:
|||
|--|--|
|appender-ref|0个或多个,容许appender引用其余appender,并非全部appender类型都支持|
|filter|0个或多个,定义此app使用的过滤器|
|layout|最多一个,定义appender使用的输出格式|
|param|0个或多个,设置Appender类中对应的属性的值|
实际上appender所能包含的子元素远不止上面4个。
布局,只能做为appender的子元素。
支持的属性:
|||
|---|---|
|type|必须的,Layout的类型|
支持的子元素:
|||
|---|---|
|param|0个或多个,设置一些参数|
过滤器,只能做为appender的子元素
支持的属性:
|||
|---|---|
|type|必须的,Filter的类型|
支持的子元素:
|||
|---|---|
|param|0个或多个,设置一些参数|
param元素能够是任何的子元素。
支持的属性:
|||
|---|---|
|name|必须的,取值是父对象的参数名|
|value|可选的,value和type中,必须有一个属性值被指定。value是一个能被转为参数值的字符串|
|type|可选的,type是一个类型名,若是type不是在log4net程序集中定义的,就须要使用全名|
支持的子元素:
|||
|---|---|
|param|0个或多个,设置一些参数|
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> 注意这些配置属性有些是可选的,若是须要,必定要写正确,不然要么输出的不是本身想要的结果,要么干脆不输出任何信息。