最近做个项目要用到日志系统,这这可把我给难住了,后来问了下度娘,发现只有你想不到的,没有那些找不到的开源组件,后来发现了log4net,但是我是控制台程序,没有个实例还真不好搞,想想还是看看他的运行过程吧,记录如下:
首先我们来分析一下Log4net的工作原理:
Log4net是基于.NET开发的一款非常著名的记录日志开源组件。它通过一套XML配置的日志引擎,将日志分不同的等级,分别 是:FATAL 、 ERROR、 WARN、 INFO 、 DEBUG、ALL(允许所有的日志请求)和OFF(拒绝所有的日志请求),缺省为DEBUG,前五个可以看到和我们平常在调试应用程序的出错有点类似, 在编译器中也会留下如错误、警告之类的提示信息,它们的错误级别不断的降低。
我们接着看Log4net的核心组成部分,Log4net主要由五个部分组成,分别为Logger,Appenders, Filters, Layouts 和Object Renders。
1) Logger:主要负责日志的记录,它记录的方式有多种,可以是以文件、数据库、控制台、邮件等多处方式;
2) Appenders:主要负责记录日志介质的方式,它的输出方式主要包括:
AdoNetAppender:将日志记录到数据库中。可以采用SQL和存储过程两种方式。
AspNetTraceAppender:能用ASP.NET中跟踪的方式查看记录的日志。
BufferingForwardingAppender:在输出到子Appenders之前先缓存日志事件。
ColoredConsoleAppender:在终端的窗口写下高亮度的日志事件。
ConsoleAppender:将日志输出到控制台。
EventLogAppender:将日志写到Windows操作系统的日志中去。
FileAppender:将日志写到文件中。
ForwardingAppender:用来为一个Appender指定一组约束。
MemoryAppender:将日志存到内存缓冲区。
NetSendAppender:将日志输出到Windows Messenger service,这些日志信息将在用户终端的对话框中显示。
OutputDebugStringAppender:配置该Appender以向OutputDebugString API写入日志。
RemotingAppender:通过.NET Remoting将日志写到远程接收端。
RollingFileAppender:将日志以回滚文件的形式写到文件中。
SmtpAppender:将日志写到邮件中。
SmtpPickupDirAppender:配置与SmtpAppender类似,但要把SmtpHost换为PickupDir。
TraceAppender:将日志写到.NET trace 系统。
UdpAppender:将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。
以上有些输出方式可能会经常用到,有些可能会不经常用到,具体我们在下面举例来说明。
3) Layouts:主要负责把记录日志格式化输出,显示得格式主要如下:
%timestamp [%thread] %-5level %logger{2} %ndc - %message%newline
timestamp: 表示程序已经开始执行的时间。 单位[毫秒]。
Thread:执行当前代码的线程。
Level:日志的级别。
Logger:日志相关请求的名称。
Message:日志消息。
newline:换行。
下面我们来举两个常用的实例来看看Log4net是如何在.NET环境下实现日志的记录的。
一、 文件记录方式:
我们考虑一下这样的情况,首先我们要把日志的记录文件存放到一个记事本文档中,另外,随着应用程序运行的时间不断增长,写入这个记事本文件的内 容也会越来越大,这个时候,我们可能会想如果按天来生成日志文件或者文件大小到达一定的大小时就自动增加一个新的日志文件,无疑会提高我们检查日志的效 率,Log4net就可以轻松的实现这样的功能。我们看具体的应用,步骤如下:
1) 首先建立一个Windows应用程序的项目,然后需要增加应用程序的配置文件App.Config,如果在WEB应用程序中,就需要配置 Web.Config,然后添加引用,加入之前我们在网上下载的Log4net.dll文件,然后在AssemblyInfo.cs文件里加入下面的语 句:
[assembly: log4net.Config.DOMConfigurator(ConfigFileExtension = "config", Watch = true)]
2) 在配置文件里面设置如下:
< ?xml version="1.0" encoding="utf-8" ?>
< configuration> < !--日志配置部分--> < configSections> < section name="log4net" type="System.Configuration.IgnoreSectionHandler" /> < /configSections> < !-- Log4net配置设定 --> < log4net debug="false"> < appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">< !--RollingFileAppender将日志以回滚文件的形式写到文件中--> < file value="log.txt" />< !--输出日志文件的路径--> < appendToFile value="true" />< !--输出日志时自动向后追加--> < rollingStyle value="Composite" /> < datePattern value=".yyyyMMdd" />< !--输出日期格式--> < maxSizeRollBackups value="10" />< !--日志最大个数--> < maximumFileSize value="1MB" />< !--单个日志的最大容量--> < staticLogFileName value="true" />< !--true表示当前最新日志文件名永远为file节中--> < layout type="log4net.Layout.PatternLayout"> < conversionPattern value="%date %-5level %logger -%m%n" /> < /layout> < /appender> < root> < level value="WARN" /> < appender-ref ref="RollingLogFileAppender" /> < /root> < /log4net> < /configuration> %d, %date :表示当然的时间 %level : 表示日志的级别 %logger, %c:表示日志产生的主题,通常是所在的类名,便于定位问题 %m, %message :表示日志的具体内容 %n, %newline: 换行 3) 然后在Form窗口的代码里先定义下面的接口: private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 我们可以在窗口中拖动一个Button控件,然后在它的Click事件中,写入以下的代码: log.Error("这是一个错误日志"); log.Fatal("这是一个致命的错误日志"); log.Warn("这是一个警告日志"); 运行过后,然后点击Button,可以看到生成一个log.txt日志文件,里面写入的内容如下: 2009-06-01 21:16:54,171 ERROR Log4netApp.Form1 -这是一个错误日志 2009-06-01 21:16:54,187 FATAL Log4netApp.Form1 -这是一个致命的错误日志 2009-06-01 21:16:54,187 WARN Log4netApp.Form1 -这是一个警告日志 当我们在第二天再运行此程序时,就会发现到前一天生成的文件已经改名成log.txt.加上年月日了,效果如图一:
图一 日志文件列表 二、 数据库记录的方式: 1) 建立存入日志的数据表LogInfo
2) 建立一个ASP.NET WEB项目,并将log4net.dll添加到引用。然后在AssemblyInfo.cs中加入下面的代码: [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] 3) 添加一个全局应用程序类Global.asax,然后在Application_Start事件里添加下面的代码: log4net.Config.XmlConfigurator.Configure(); 4) 接下来需要在Web.Config文件里面配置详细的数据库设置,如下:
< ?xml version="1.0"?> < configuration> < !--日志配置部分--> < configSections> < section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> < /configSections> < appSettings/> < connectionStrings/> < system.web> < compilation debug="true" /> < authentication mode="Windows" /> < /system.web> < !-- Log4net配置设定 --> < log4net> < logger name="LogRecord"> < level value="ALL" /> < appender-ref ref="AdoNetAppender_SqlServer" /> < /logger> < appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender"> < bufferSize value="1"/>< !--log信息记录的缓冲大小 --> < connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> < connectionString value="data source=(local);initial catalog=test1;integrated security=false;persist security info=True;User ID=sa;Password="/>< !--数据库连接字符串 --> < commandText value="INSERT INTO LogInfo([AddDate],[Message]) Values( @log_date,@message)"/> < !--数据库插入 --> < parameter> < parameterName value="@log_date" /> < dbType value="DateTime" /> < layout type="log4net.Layout.RawTimeStampLayout" />< !--当前日期 --> < /parameter> < parameter> < parameterName value="@message" /> < dbType value="String" /> < size value="2000" /> < layout type="log4net.Layout.PatternLayout">< !--后台日志的信息 --> < conversionPattern value="%message" /> < /layout> < /parameter> < /appender> < /log4net> < /configuration> 5) 然后在页面上拖一个Button控件和一个Label控件,在Button控件的点击事件中写入以下代码:
运行后,点击按钮,点击几次,就会在库中增加几条记录,效果如图二:
图二 Log4net插入数据库 以上介绍的是Log4net常用的两种日志的记录方法,在实际应用中,还有其它的记录方法,如控制台的应用、将日志的信息发送到指定的邮箱。 可以见得,在开发过程中我们在运用Log4net时,可以给我们的应用程序带来丰富的体验度,通过提高日志的记录性能,可以精确的控制日志信息 的输出,在.NET中,可以方便的通过配置文件,就方便日志的记录,Log4net还有其它很多丰富的应用功能,感兴趣的朋友可以进一步的去研究它。 |