Log4Net很早以前就听说过 可一直没有仔细看过
终于有时间 想看看它了 花了点时间研究了下
1.介绍
Log4net是基于.net开发的一款非常著名的记录日志开源组件。他最早是2001年7月由NeoWorks Limited启动的项目,基本的框架源于另外的一个非常著名的姐妹组件-log4j(可惜.net下怎么就没有这样优秀的软件首先出现呢,都要从j那边“引进”)。Log4net记录日志的功能非常强大。它可以将日志分不同的等级,比不同的样式,将日志输出到不同的媒介。
官方网站:http://logging.apache.org/log4net/
下载:http://logging.apache.org/log4net/download.html(开源)
下载包里包括.net 1.0/1.1/2.0等版本和各种平台下的DEMO
官方SDK:http://logging.apache.org/log4net/release/sdk/index.html
2.使用
2.1引入log4net.dll组件
2.2建立一个配置文件
两种方法,一种是在Web.Config或App.Config里
加入以下配置节
Code
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
上面的配置节,复制就可以用了加入log4net配置内容的定义,这个紧接着上面的内容定义在config文件里就可以了,下面是一个范例:
Code
<!--日志配置部分-->
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<!--写入到操作系统-->
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
</layout>
</appender>
<!--写入到文件 -->
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<!--<file value="log\log.txt"/>-->
<!--<file name="Client.Logging" value="log\log" />-->
<file value="Log\log" />
<!--是否覆盖-->
<appendToFile value="true"/>
<!--设置无限备份=-1 ,最大备份数为1000-->
<maxSizeRollBackups value="1000"/>
<!--每个文件的最大20k-->
<maximumFileSize value="20"/>
<!--名称是否可以更改 为false为可以更改-->
<param name="StaticLogFileName" value="false" />
<!--文件名称-->
<param name="DatePattern" value="yyyyMMdd".txt"" />
<param name="RollingStyle" value="Composite" />
<!--<param name="RollingStyle" value="Composite" />-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%r] [%t] %p %c - %m%n%n" />
</layout>
</appender>
<!--写入到文件,是累加,不生成新的文件-->
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="log\log-file.txt" />
<appendToFile value="false" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<!--写入到数据库-->
<appender name="ADONetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
<!--<bufferSize value="10" />-->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<connectionString value="Server=10.88.**.**;UID=sa;PWD=******;DataBase=Inquiry;Max Pool Size=1000"/>
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)"/>
<parameter>
<parameterName value="@log_date"/>
<dbType value="DateTime"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
</layout>
<!-- <layout type="log4net.Layout.RawTimeStampLayout"/>-->
</parameter>
<parameter>
<parameterName value="@thread"/>
<dbType value="String"/>
<size value="255"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread"/>
</layout>
</parameter>
<parameter>
<parameterName value="@log_level"/>
<dbType value="String"/>
<size value="50"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level"/>
</layout>
</parameter>
<parameter>
<parameterName value="@logger"/>
<dbType value="String"/>
<size value="255"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger"/>
</layout>
</parameter>
<parameter>
<parameterName value="@message"/>
<dbType value="String"/>
<size value="4000"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message"/>
</layout>
</parameter>
</appender>
<!-- 发送邮件-->
<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
<authentication value="Basic" />
<to value="fengsheng@cnpcag.com" />
<from value="fengsheng@cnpcag.com" />
<username value="Feng Sheng" />
<password value="******" />
<subject value="test logging message" />
<smtpHost value="mail.cnpcag.com" />
<bufferSize value="512" />
<lossy value="true" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="ALL"/>
</evaluator>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" />
</layout>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="ADONetAppender_SqlServer"/>
<appender-ref ref="SmtpAppender"/>
<!-- <appender-ref ref="RollingLogFileAppender"/>
<appender-ref ref="EventLogAppender"></appender-ref>
<appender-ref ref="AdoNetAppender_Access"></appender-ref>
<appender-ref ref="ColoredConsoleAppender"></appender-ref>
<appender-ref ref="FileAppender"></appender-ref> -->
</root>
<!-- Specify the level for some specific categories -->
<logger name="ADONetAppender_SqlServer">
<!-- <appender-ref ref="B" /> -->
<level value="ALL"/>
<appender-ref ref="ADONetAppender_SqlServer"/>
<appender-ref ref="RollingLogFileAppender"/>
</logger>
</log4net>
2.3 关联配置文件
当我们创建了上面的配置文件后,我们接下来需要把它和我们的应用联系起来。缺省的,每个独立的可执行程序集都会定义它自己的配置。log4net框架使用 log4net.Config.DOMConfiguratorAttribute在程序集的级别上定义配置文件。
例如:可以在项目的AssemblyInfo.cs文件里添加以下的语句
[assembly:log4net.Config.DOMConfigurator(ConfigFile="filename",
ConfigFileExtension="ext",Watch=true/false)]
l ConfigFile:[/B]指出了我们的配置文件的路径及文件名,包括扩展名。
l ConfigFileExtension:[/B]如果我们对被编译程序的程序集使用了不同的文件扩展名,那么我们需要定义这个属性,缺省的,程序集的配置文件扩展名为”config”。
l Watch (Boolean[/B]属性):[/B] log4net框架用这个属性来确定是否需要在运行时监视文件的改变。如果这个属性为true,那么FileSystemWatcher将会被用来监视文件的改变,重命名,删除等事件。
其中:ConfigFile和ConfigFileExtension属性不能同时使用,ConfigFile指出了配置文件的名字,例如,ConfigFile=”Config.txt”
ConfigFileExtension则是指明了和可执行程序集同名的配置文件的扩展名,例如,应用程序的名称是”test.exe”,ConfigFileExtension=”txt”,则配置文件就应该是”test.exe.txt” ;
对于Web网站 可以在Global.asax 配置如下:
Code
void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
log4net.Config.XmlConfigurator.Configure();
}
2.4 测试
Code
protected void Button1_Click(object sender, EventArgs e)
{
log4net.ILog log = log4net.LogManager.GetLogger("ADONetAppender_SqlServer");
log.Info("hello world!");
}
protected void Button2_Click(object sender, EventArgs e)
{
log4net.ILog log = log4net.LogManager.GetLogger("ADONetAppender_SqlServer");
log.Debug("hello world!");
}
3.说明:
关键在于配置,弄清楚了2.2中的配置以后,对于使用就没有任何问题了。
这个东西的强大是有很多中记录日志的方式,在我给出的配置文件里 写出了好几种记录输出方式,经过我亲自测试,都是可以使用的。其实还有很多记录输出方式(参见http://www.cnblogs.com/shyblog/archive/2008/11/18/1336052.html),感觉很少会用到,我这里就没有提到了。
个人推崇的三种记录日志方式:
(1)数据库记录(如果不影响系统性能,此为首选,方便查询与统计)
(2)windows 事件日志 (这个使我感到它的强大)
(3)电子邮件
其实在实际过程中可以筛选,或者多种输出方式交替使用,比如 所有类型的日志都记录到数据库,等级在WARN以上的日志记录到windows或者文本中,ERROR类型以上的的发送到管理员邮箱。
4.其他:
其实还有很多配置和使用我没有了解清楚,这个还有待以后具体了解。
同时我还碰到几个问题
(1)日志记录近数据库时,感觉有较长的延时(慢5分钟左右,数据库为SQL Server 2000),不知为何
(2)若用多种方式,或者仅用一种方式输出日志时,对系统性能是否有较大影响
(3)应用系统出了关键错误时,那个时候log4net是不是根本就没发发挥作用了,因为系统挂掉了~
5.参考文章(排名部分先后):
(1)Log4Net使用指南 http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html
(2)解决log4net独占日志文件的问题以及 log4net的各种输出配置(Appender) http://www.cnblogs.com/jacktu/archive/2007/12/05/984487.html
(3).NET开源项目介绍及资源推荐:日志记录 http://www.cnblogs.com/Terrylee/archive/2006/12/03/opensource_framework_and_resource_recommendation_Log.html
(4)Log4Net五步走 http://heroman.cnblogs.com/archive/2006/01/09/314053.html
(5)Log4Net 开发文档 http://www.cnblogs.com/macroxu-1982/archive/2008/12/04/1347407.html
(6)Log4net学习笔记 http://www.cnblogs.com/agtaimaer/archive/2008/11/15/log4net.html
(7)DEMO下载 https://files.cnblogs.com/agtaimaer/Log4netDemo.rar