您的位置:首页 > 其它

Log4Net日志记录两种方式

2018-01-12 08:41 316 查看
简介

     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处于相同的位置,即根目录下):



      %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的单击事件中添加如下代码:



结果

 



案例二:日志记入数据库

      记入数据库的方式和记入文件的方式大同小异,主要区别在配置文件,其他步骤相同,记入数据库的配置文件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="1" />
10       <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
11       <connectionString value="SERVER=127.0.0.1;DATABASE=TestDataBase;UID=sa;PWD=123456;Connect Timeout=15;" />
12       <commandText value="INSERT INTO ErrorLog ([dtDate],[sThread],[sLevel],[sLogger],[sMessage],[sException]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
13       <parameter>
14         <parameterName value="@log_date" />
15         <dbType value="DateTime" />
16         <layout type="log4net.Layout.RawTimeStampLayout" />
17       </parameter>
18       <parameter>
19         <parameterName value="@thread" />
20         <dbType value="String" />
21         <size value="100" />
22         <layout type="log4net.Layout.PatternLayout">
23           <conversionPattern value="%t" />
24         </layout>
25       </parameter>
26       <parameter>
27         <parameterName value="@log_level" />
28         <dbType value="String" />
29         <size value="200" />
30         <layout type="log4net.Layout.PatternLayout">
31           <conversionPattern value="%p" />
32         </layout>
33       </parameter>
34       <parameter>
35         <parameterName value="@logger" />
36         <dbType value="String" />
37         <size value="500" />
38         <layout type="log4net.Layout.PatternLayout">
39           <conversionPattern value="%logger" />
40         </layout>
41       </parameter>
42       <parameter>
43         <parameterName value="@message" />
44         <dbType value="String" />
45         <size value="3000" />
46         <layout type="log4net.Layout.PatternLayout">
47           <conversionPattern value="%m" />
48         </layout>
49       </parameter>
50       <parameter>
51         <parameterName value="@exception" />
52         <dbType value="String" />
53         <size value="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="WARN"/>
60       <level value="INFO"/>
61       <level value="DEBUG"/>
62       <level value="FINE"/>
63       <appender-ref ref="ADONetAppender" />
64     </root>
65     <!-- specify the level for some specific categories -->
66     <logger name="iNotes">
67       <level value="WARN"/>
68       <level value="INFO"/>
69       <level value="DEBUG"/>
70       <level value="FINE"/>
71       <appender-ref ref="ADONetAppender"/>
72     </logger>
73     <logger name="StellaLogger">
74       <level value="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)


测试

     采用上面的测试方法。

结果

      


结语

     项目中经常用到的两种方式在这里做一下总结。其他方式,用到了再补上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: