首页 > 代码库 > Log4Net日志记录两种方式
Log4Net日志记录两种方式
本文转载:http://www.cnblogs.com/wolf-sun/p/3347373.html#3009010
简介
log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。
log4net是Apache软件基金会Apache Logging Services工程的一部分。Apache日志服务工程致力于为程序调试和审计提供跨语言的日志服务。(f:百度百科)
原理
Log4net是基于.NET开发的一款记录日志开源组件。它通过一套XML配置的日志引擎,将日志分不同的等级,分别是:FATAL 、 ERROR、 WARN、 INFO 、 DEBUG、ALL(允许所有的日志请求)和OFF(拒绝所有的日志请求),缺省为DEBUG,前五个是不是很熟悉?可以看到和我们平常在调试应用程序的出错有点类似,在编译器中也会留下如错误、警告之类的提示信息,它们的错误级别在不断的降低。
log4net开源项目结构如图所示:
通过查看源码,log4net主要有5个核心部分组成,分别为Logger,Appenders, Filters, Layouts 和Object Renders,在配置文件中它们以节点的形式出现。
- Logger:主要负责日志的记录,它记录的方式有多种,可以是以文件、数据库、控制台、邮件等多处方式;
- 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.dll,然后在添加一个配置文件log4net.config(这里不将配置信息写入web.config,个人觉得写在一起实在太乱)中添加下面的配置信息(注意应和web.config处于相同的位置,即根目录下):
1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3 <!--日志配置部分--> 4 <configSections> 5 <!--注册lognet--> 6 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> 7 </configSections> 8 <log4net debug="false"> 9 <root>10 <priority value="http://www.mamicode.com/ALL"/>11 <appender-ref ref="TraceAppender"/>12 <appender-ref ref="ConsoleAppender"/>13 <appender-ref ref="RollingFileAppender"/>14 </root>15 <appender name="TraceAppender" type="log4net.Appender.TraceAppender">16 <layout type="log4net.Layout.PatternLayout">17 <conversionPattern value="http://www.mamicode.com/%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline"/>18 </layout>19 </appender>20 <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">21 <layout type="log4net.Layout.PatternLayout">22 <conversionPattern value="http://www.mamicode.com/%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline"/>23 </layout>24 </appender>25 <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">26 <file value="http://www.mamicode.com/Log/SysLog"/>27 <!--日志文件夹及文件名开头-->28 <appendToFile value="http://www.mamicode.com/true"/>29 <!--是否追加到文件-->30 <RollingStyle value="http://www.mamicode.com/Date"/>31 <!--日期的格式-->32 <DatePattern value="http://www.mamicode.com/yyyy-MM-dd"/>33 <!--文件名后面加上.log后缀,必须使用转义字符-->34 <maximumFileSize value="http://www.mamicode.com/1MB" />35 <!--最大文件大小-->36 <StaticLogFileName value="http://www.mamicode.com/false"/>37 <!--日志文件名是否为静态-->38 <layout type="log4net.Layout.PatternLayout,log4net">39 <param name="ConversionPattern" value="http://www.mamicode.com/%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline"/>40 <param name="Header" value="http://www.mamicode.com/------------------网站运行过程中产生的错误--------------------------"/>41 <param name="Footer" value="http://www.mamicode.com/-----------------测试:GZQ-------------------------------------"/>42 </layout>43 </appender>44 </log4net>45 <!--End站点日志配置部分-->46 </configuration>
%d, %date :表示当然的时间
%level : 表示日志的级别
%logger, %c:表示日志产生的主题,通常是所在的类名,便于定位问题
%m, %message :表示日志的具体内容
%n, %newline: 换行
在AssemblyInfo.cs中添加如下代码:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
在全局处理程序中添加如下代码:
1 protected void Application_Start(object sender, EventArgs e)2 {3 log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));4 }
测试
在页面添加button和一个label,在button的单击事件中添加如下代码:
1 protected void btnShowTime_Click(object sender, EventArgs e) 2 { 3 log4net.ILog myLogger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 4 myLogger.Warn("这是一个警告日志"); 5 myLogger.Info("单击了按钮"); 6 myLogger.Debug("用Log4Net写入数据库日志"); 7 myLogger.Error("这是一个错误日志"); 8 myLogger.Fatal("这是一个致命的错误日志"); 9 try10 {11 ILog logger = LogManager.GetLogger("LogRecord");12 logger.Debug("用Log4Net写入数据库日志");13 int x = 5;14 int y = 0;15 Response.Write(x / y);16 }17 catch (Exception ex)18 {19 myLogger.Error(ex);20 }21 finally22 {23 lblShow.Text = DateTime.Now.ToLongTimeString()+":操作日志已记录完成";24 }25 }
结果
案例二:日志记入数据库
记入数据库的方式和记入文件的方式大同小异,主要区别在配置文件,其他步骤相同,记入数据库的配置文件log4net.config如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3 <configSections> 4 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 5 </configSections> 6 <!--Log4net Begin--> 7 <log4net> 8 <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender"> 9 <bufferSize value="http://www.mamicode.com/1" />10 <connectionType value="http://www.mamicode.com/System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />11 <connectionString value="http://www.mamicode.com/SERVER=127.0.0.1;DATABASE=TestDataBase;UID=sa;PWD=123456;Connect Timeout=15;" />12 <commandText value="http://www.mamicode.com/INSERT INTO ErrorLog ([dtDate],[sThread],[sLevel],[sLogger],[sMessage],[sException]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />13 <parameter>14 <parameterName value="http://www.mamicode.com/@log_date" />15 <dbType value="http://www.mamicode.com/DateTime" />16 <layout type="log4net.Layout.RawTimeStampLayout" />17 </parameter>18 <parameter>19 <parameterName value="http://www.mamicode.com/@thread" />20 <dbType value="http://www.mamicode.com/String" />21 <size value="http://www.mamicode.com/100" />22 <layout type="log4net.Layout.PatternLayout">23 <conversionPattern value="http://www.mamicode.com/%t" />24 </layout>25 </parameter>26 <parameter>27 <parameterName value="http://www.mamicode.com/@log_level" />28 <dbType value="http://www.mamicode.com/String" />29 <size value="http://www.mamicode.com/200" />30 <layout type="log4net.Layout.PatternLayout">31 <conversionPattern value="http://www.mamicode.com/%p" />32 </layout>33 </parameter>34 <parameter>35 <parameterName value="http://www.mamicode.com/@logger" />36 <dbType value="http://www.mamicode.com/String" />37 <size value="http://www.mamicode.com/500" />38 <layout type="log4net.Layout.PatternLayout">39 <conversionPattern value="http://www.mamicode.com/%logger" />40 </layout>41 </parameter>42 <parameter>43 <parameterName value="http://www.mamicode.com/@message" />44 <dbType value="http://www.mamicode.com/String" />45 <size value="http://www.mamicode.com/3000" />46 <layout type="log4net.Layout.PatternLayout">47 <conversionPattern value="http://www.mamicode.com/%m" />48 </layout>49 </parameter>50 <parameter>51 <parameterName value="http://www.mamicode.com/@exception" />52 <dbType value="http://www.mamicode.com/String" />53 <size value="http://www.mamicode.com/4000" />54 <layout type="log4net.Layout.ExceptionLayout" />55 </parameter>56 </appender>57 <!-- setup the root category, add the appenders and set the default level -->58 <root>59 <level value="http://www.mamicode.com/WARN"/>60 <level value="http://www.mamicode.com/INFO"/>61 <level value="http://www.mamicode.com/DEBUG"/>62 <level value="http://www.mamicode.com/FINE"/>63 <appender-ref ref="ADONetAppender" />64 </root>65 <!-- specify the level for some specific categories -->66 <logger name="iNotes">67 <level value="http://www.mamicode.com/WARN"/>68 <level value="http://www.mamicode.com/INFO"/>69 <level value="http://www.mamicode.com/DEBUG"/>70 <level value="http://www.mamicode.com/FINE"/>71 <appender-ref ref="ADONetAppender"/>72 </logger>73 <logger name="StellaLogger">74 <level value="http://www.mamicode.com/ALL"/>75 <appender-ref ref="AdoNetAppender" />76 </logger>77 </log4net>78 <!--Log4net End-->79 </configuration>
创建记录日志的数据表:
1 CREATE TABLE [dbo].[ErrorLog]( 2 3 [nId] [bigint] IDENTITY(1,1) NOT NULL, 4 5 [dtDate] [datetime] NOT NULL, 6 7 [sThread] [varchar](100) NOT NULL, 8 9 [sLevel] [varchar](200) NOT NULL, 10 11 [sLogger] [varchar](500) NOT NULL, 12 13 [sMessage] [varchar](3000) NOT NULL, 14 15 [sException] [varchar](4000) NULL)
测试
采用上面的测试方法。
结果
结语
项目中经常用到的两种方式在这里做一下总结。其他方式,用到了再补上。