log4net的作用
提供一个记录日志的框架,可以将日志信息记录到文件(txt、xml等)、控制台、Windows事件日志和数据库(MSSQL、Acess、Oracle、DB2和SQLite等)。
要想使用log4net,我把它分为三步:
第一:在项目中引用log4net组件
第二:配置log4net,一般都写在web.config中(BS) app.config(CS)
第三:调用部分
说明:关于第二步,根据经验配置文件一般不写在app.config 或 web.config中
理由: 一个项目随着需求的变更,配置字节会特别多,不便查阅及维护而且一但更改配置文件,就会引起IIS重启(BS)
解决方案:我们可以利用以下方法来实现:
log4net.Config.XmlConfigurator.ConfigureAndWatch(FileInfo fileInfo);
它用来加载配置文件,这个配置文件可以放在任意地方,与项目其他程序完成分离。
而且通过这种方式,不用在AssemblyInfo.cs文件中添加 [assembly: log4net.Config.XmlConfigurator()]
一、引用log4net组件
到http://logging.apache.org/log4net/download_log4net.cgi下载最新的压缩包log4net-2.0.8-bin-newkey.zip
解压后将获得的log4net.dll文件,添加到工程的引用(我用的net 4.0版本)
如果添加命名空间 using log4net; 时提示 未能找到类型或命名空间名称"log4net"(是否缺少using指令或程序集引用?)
<?xml version="1.0"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net-2.0.8"/> </configSections> <log4net> <logger name="logerror"> <level value="ALL" /> <appender-ref ref="ErrorAppender" /> </logger> <logger name="loginfo"> <level value="ALL" /> <appender-ref ref="InfoAppender" /> </logger> <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="yyyyMMdd".htm"" /> <param name="RollingStyle" value="Date" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="<HR COLOR=red>%n异常时间:%d [%t] <BR>%n异常级别:%-5p <BR>%n异 常 类:%c [%x] <BR>%n%m <BR>%n <HR Size=1>" /> </layout> </appender> <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="Log\LogInfo\" /> <param name="AppendToFile" value="true" /> <param name="MaxFileSize" value="10240" /> <param name="MaxSizeRollBackups" value="100" /> <param name="StaticLogFileName" value="false" /> <param name="DatePattern" value="yyyyMMdd".htm"" /> <param name="RollingStyle" value="Date" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="<HR COLOR=blue>%n日志时间:%d [%t] <BR>%n日志级别:%-5p <BR>%n日 志 类:%c [%x] <BR>%n%m <BR>%n <HR Size=1>" /> </layout> </appender> </log4net> </configuration>
三、调用
1.在AssemblyInfo.cs文件中增加一行代码
[assembly: log4net.Config.XmlConfigurator( ConfigFile="log4net.config", ConfigFileExtension = "config", Watch = true)]
或在程序中添加如下代码
FileInfo fileInfo = new FileInfo("log4net.config"); log4net.Config.XmlConfigurator.ConfigureAndWatch(fileInfo);
2.在主程序添加如下代码
log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo"); loginfo.Info(string.Format("当前的时间{0}", DateTime.Now)); log4net.ILog logerror = log4net.LogManager.GetLogger("logerror"); loginfo.Info(string.Format("当前的时间{0}", DateTime.Now));
运行后会在binReleaseLogLogInfo 下生成 年月日.htm文件,显示如下
说明:
1、.confg文件必须和可执行文件在同一目录,如放在binRelease目录下
如果不在同一目录,可以在解决方案资源管理器中的log4net.config文件上右键,选择属性,复制到输出目录,如果较新则复制
logger是负责日志的记录者,假设我们需要记录一些正常的运行时日志和出现异常时的错误日志,那么我们可以通过在配置文件当中添加两个Logger实现。
appender提供记录的介质,前面谈到,我们可能要同时将数据记录到文件和数据库中,我们可以简单地通过编写appender实现,而且Log4Net当中已经默认提供了一些常用的appender,我们可以简单地修改一些配置文件就实现同时向数据库和同时向文件中写入的功能。
layout负责把记入的内容格式化。其实就是决定日志文件要长什么样子。
Logger节点的解释
以错误日志类为例进行解释
<!-- 错误日志类--> <logger name="logerror"> <!-- 日志类的名字--> <level value="ALL" /> <!-- 定义记录的日志级别--> <appender-ref ref="ErrorAppender" /><!-- 记录到什么介质中--> </logger>
level定义记录的日志级别,就是说,你要记录哪个级别以上的日志,级别由高往低依次是:
None |
Fatal |
ERROR |
WARN |
DEBUG |
INFO |
ALL |
级别的定义要注意,如果你定义DEBUG,那么低于DEBUG级别以下的信息,将不会记入日志,啥意思呢?就是说,就算你在程序里,用log.info()来写入一个日志信息,可是你在配置中指定level为DEBUG,由于INFO级别低于DEBUG,所以,不会被记入日志.这样的处理非常灵活
appender-ref定义日志要写入到什么介质中中。上面例子中就是写入到ErrorAppender这个介质中,在ErrorAppender节点我们可以定义跟日志有关的要写入到什么地方,日志文件的格式是什么等信息。
appender节点的解释
以ErrorAppender为例
<!-- 错误日志附加介质--> <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender"> <!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质--> <param name="File" value="Log\LogError\" /> <!-- 输出到什么目录--> <param name="AppendToFile" value="true" /><!-- 是否覆写到文件中--> <param name="MaxSizeRollBackups" value="100" /><!-- 备份文件的个数--> <param name="MaxFileSize" value="10MB" /><!-- 单个日志文件最大的大小--> <param name="StaticLogFileName" value="false" /><!-- 是否使用静态文件名--> <param name="DatePattern" value="yyyyMMdd".htm"" /><!-- 日志文件名--> <param name="RollingStyle" value="Date" /> <!--布局--> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="<HR COLOR=red>%n异常时间:%d [%t] <BR>%n异常级别:%-5p <BR>%n异 常 类:%c [%x] <BR>%n%m <BR>%n <HR Size=1>" /> </layout> </appender>
appender节点中,type=RollingFileAppender 的意思是将日志以回滚文件的形式写到文件中。
File节点中规定了文件要写入到什么目录中,上例中的“Log\LogError\”代表写入到“程序输入目录(Debug目录)LogLogError”文件夹中。
AppendToFile节点规定了是否覆写到文件中。假设我们已经有了一个20131028.htm日志文件,当为true的时候,日志文件会附加到这个文件上。为false的时候,Log4Net会先将原来的日志文件备份,生成一个新的日志文件(见下图)。
MaxFileSize 最大的文件大小。我们可以使用"KB", "MB" 或 "GB"为 MaxFileSize 作为后缀限定大小。默认的文件大小是10MB。
RollingStyle是文件创建的方式。上例中市设置为以Date方式创建新文件。
DatePattern 日期格式,当我们设置了RollingStyle 为Date方式后,Log4Net会自动使用DatePattern 中的日期格式来创建新的日志文件。
MaxSizeRollBackups这个属性用来设置,当日志文件达到MaxFileSize大小,就自动创建备份文件。备份文件的多少由MaxSizeRollBackups决定。比如说,我们是以日期格式作为日志文件名的,假设今天是2013-10-28,那么今天创建的日志文件名就是20131028.htm,当这个文件中要超过MaxFileSize的时候,Log4Net就自动将老的20131028.htm改名为20131028.htm.1,并创建一个新的20131028.htm文件。
StaticLogFileName 是否采用静态文件名。因为我们这个例子是采用以日期作为文件名,每天的日志文件的名字都是动态的,所以上例中为false。如果采用静态文件名,那么日志文件的名字就是唯一确定的。可以参考下面的配置文件进行设置。下面的配置文件中就是采用静态文件名,生成的日志文件名都是log.txt。
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="log.txt" /> <appendToFile value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="10" /> <maximumFileSize value="100KB" /> <staticLogFileName value="true" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> </layout> </appender>
layout就是布局。Layout中的ConversionPattern就是日志文件的格式,一些符号的介绍附加在下面。由于格式化的方式比较多,除了下面介绍的,大家也可以自己看看官方文档。
%m[%message] | 输出的日志消息 |
%n | 换行 |
%d[%datetime] | 输出当前语句运行的时刻 |
%r | 输出程序从运行到执行到当前语句时消耗的毫秒数 |
%t | 当前语句所在的线程ID |
%p | 日志的当前优先级别 |
%c | 当前日志对象的名称 |
%L | 输出语句所在的行号 |
%F | 输出语句所在的文件名 |
%-数字 | 表示该项的最小长度,如果不够,则用空格填充 |
参考:
[2]在C#代码中应用Log4Net(一)简单使用Log4Net (一系列文章,简单明了)
[3]log4net使用详解
[4]Log4Net五步走