log4net 配置与应用 (转自 http://www.cnblogs.com/xchunyu/archive/2004/07/02/20554.html && http://www.cnblogs.com/heroman/archiv)

1,引入log4net.dll组件
2,建立一个配置文件
两种方法,一种是在Web.Config或App.Config里
加入以下配置节
<configSections>
 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
上面的配置节,复制就可以用了

加入log4net配置内容的定义,这个紧接着上面的内容定义在config文件里就可以了,下面是一个范例:
<log4net>
 <root>
 <level value="ALL" />
 <appender-ref ref="rollingFile" />
 </root>

 <appender  name="rollingFile" type="log4net.Appender.RollingFileAppender,log4net" >
 <param name="File" value="log.txt" />
 <param name="AppendToFile" value="false" />
 <param name="RollingStyle" value="Date" />
 <param name="DatePattern" value="yyyy.MM.dd" />
 <param name="StaticLogFileName" value="true" />
 <layout type="log4net.Layout.PatternLayout,log4net">
  <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
  <param name="Header" value="&#13;&#10;----------------------header--------------------------&#13;&#10;" />
  <param name="Footer" value="&#13;&#10;----------------------footer--------------------------&#13;&#10;" />
 </layout>
 </appender> 
 <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net"> 
  <layout type="log4net.Layout.PatternLayout,log4net">
     <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
  </layout>
 </appender> 
 <logger name="Log4NetTest.LogTest">
  <level value="DEBUG" />
  <appender-ref  ref="rollingFile" />
  <appender-ref ref="coloredConsoleApp" />
  <appender-ref ref="SystemEvent" />
 </logger>
</log4net>
你懒得写的话,复制上面的内容也可以
不过,还是稍做讲解,log4net配置节的XSD层次如下

<log4net>
 <root><level /><appender-ref ref="" /></root>
 <appender name="" type="Appender的完全限定类名">
 <param name="" value="" />
 <layout type="log4net.Layout.PatternLayout,log4net">
  <param name="" value="" />
 </layout>
 </appender>
 <logger>
 <level value="" />
 <appender-ref ref="" />
</logger>
看不懂?其实很简单啦
log4net是log4net配置节的根标记
root标记定义一个根级别的记录者,log4net的记录者采用层级组织的, 两个logger,A的名字叫loggerA,B的名字叫loggerA.B的话,那么B就是A的儿子,B会自动继承A的一些定义,例如LEVEL定义,appender-ref定义等,root就是总的logger,其余定义的logger都是他的后代,都会继承他的设置

包括ROOT在内的每一个LOGGER(ROOT也是一个LOGGER,只不过,他是祖先而已,别的方面,跟其他LOGGER一样),都可以定义Level
level定义记录的日志级别,就是说,你要记录哪个级别以上的日志,级别由高往低依次是:
None
Fatal
ERROR
WARN
DEBUG
INFO
ALL

级别的定义要注意,如果你定义DEBUG,那么低于DEBUG级别以下的信息,将不会记入日志,啥意思呢?就是说,就算你在程序里,用log.info()来写入一个日志信息,可是你在配置中指定level为DEBUG,由于INFO级别低于DEBUG,所以,不会被记入日志.这样的处理非常灵活

Logger还有一个配置就是appender-ref了,ref是参照的意思,log4net的架构非常有意思,可扩展性非常高非常值得借鉴,他分为四个要素:
logger
appender
layout
filter

logger是负责日志的记录者
appender提供记录的介质
layout负责把记入的内容格式化
filter负责把内容进行筛选

可以说,整个过程就是一个日志流水线,每个成员负责其中的一个环节
logger发出记录信息,appender接到信息,根据内部的layout配置对记录信息格式化,根据filter决定此信息是否被过滤掉,最后,将其序列化

因此,logger的appender-ref就是定义说,LOGGER要找谁去将内容写入磁盘,流或其他介质,因此,十分重要吧
既然是ref引用,那肯定要定义这个被引用的appender对象了呀

每个appender都代表了一个输出介质
name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质
log4net支持的appender类型有十几种,最常用的有rollingFileAppender,AdoNetAppender,EventLogAppender,FileAppender,分别把日志记入文件,系统日志和数据库
除此之外,appender内的其他参数都用param标记,以key/value形式定义于其内
这里有个小提示,每一个appender,log4net并没有在文档中提出他们需要哪些参数,那么,我们怎么知道呢?
原来,这些param的名称,你可以直接查对应的appender类的属性名即可,例如,使用EventLogAppender时,通过查看类的属性,我们知道其有
LogName,ApplicationName属性,那么,意味着,你可以直接在这个APPENDER的param里加入以下内容:
<param name="LogName" value="Application" />
<param name="ApplicationName" value="log4netTest" />

定义了appender的NAME及TYPE属性,以及使用param为其指定参数后,一个appender就建立了,你可以使用他的名字在LOGGER的<appender-ref中去 引用它,那么,引用它的LOGGER在写入日志时,就是写到了APPENDER中定义的介质中去了
一个LOGGER可以引用多个APPENDER,其结果是,同一个日志,被同时记录到多个介质中去 ,便如,同时发邮件,写入系统日志,发送到远程主机.不过,虽然可以这样做,但是还是要小心,因为,会对性能有一定的影响,除非你需要,否则,不要乱用此功能

另外,appender中可以定义可选的layout,layout的定义非常有必要,如果你不想将来看到你的日志会感觉头晕的话,虽然log4net帮你写入日志,但是,日志信息的格式却是我们使用者自行定义的
layout的type参数指定使用哪个类的定义来格式化,常用的有XmlLayout,SimpleLayout,PatternLayout,这个当然要根据你的需要,以及你要产生的格式来选啦,如果你要输出成XML文档格式,你肯定不能用simplelayout吧
layout使用param以KEY/VALUE形式定义其参数
各个Layout类使用的参数当然不一样啦,具体的,你可以去看各个Layout类的属性
其中,PatternLayout可以使用ConversionPattern参数来指定一个格式化字符串
以及可以指定一个Header参数,做为日志开头的字符串,Footer来指定结尾字符串
这里有一个小技巧,日志中开头和结尾总想产生回车符吧,虽然logger在写入一条日志会自动回车,可是Header和FOOTER却不会,咋办?用\n\r吗?(我从别人的BLOG上看到过)经实践,\n\r会原样定改日志,根本不会转换.其实,我们可以用XML实体呀,使用&#13;&#10;就可以在指定位置插入一个回车换行符了

最后,像log4net的文档中说的那样,如果你不想你的日志文件变得很大,使读写的性能下降的话,建议你还是分级管理日志,把粒度变小点,也就是说,除了定义ROOT外,最后,对每一个模块或每一个实体,依据用途,目的,定义各自的LOGGER配置,这样的好处是日志被分散了,日志文件增长就没那么快了.每一个LOGGER的结构跟ROOT是一模一样的,这里不再叙述了.像前面说的那样,如果你相让日志产生层级关系,你可以跟他们的NAME属性像C#中的namespace那样命名就可以了
要说明的是,LOGGER的定义是非必须的,只是一种建议罢了,Log4net的配置中,除了必须定义一个ROOT和一个APPENDER外,其他的都是可选的

另一种配置log4net的方法,是在单独的XML文件中配置,这个时候,只要把log4net标记中的内容复制过来就行了,不需要configSections

3,在应用程序代码中读取配置
这一步非常简单,你可以在应用程序集的assemblyInfo.cs文件中读取log4net配置
对于WINFORM应用程序,你可以加入
[assembly:log4net.Config.DOMConfigurator()]或
[assembly:log4net.Config.XmlConfigurator()]
对于WEBFORM你可以加入
[assembly:log4net.Config.DOMConfigurator(ConfigFile="web.config",Watch=true)]

注意:如果使用NUNIT测试的朋友,要用生成后事件,copy "$(ProjectDir)app.config" "$(TargetPath).config"

4.在应用程序中获取ILog对象
在需要使用LOGGER功能的类中,引入log4net空间,为类加入静态只读成员(静态的目的是只用一个对象,只读是防止误改)
private static readonly ILog logger=LogManager.GetLogger(typeof(类))
这里就可以获取配置文件中与类名同名的LOGGER对象了

5,写入日志
很简单 logger.Deub(写入的内容)
其他的还有info,warn,error等,很容易理解的

 

        Appenders

Appenders决定日志输出的方式。

Appenders必须实现log4net.Appenders.IAppender接口。

Log4net目前支持的输出方式包括:
1 AdoNetAppender
    将日志记录到数据库中。可以采用SQL和存储过程两种方式。

2 AnsiColorTerminalAppender
    在ANSI 窗口终端写下高亮度的日志事件。

3 AspNetTraceAppender
    能用asp.net中Trace的方式查看记录的日志。

4 BufferingForwardingAppender
    在输出到子Appenders之前先缓存日志事件。

5 ConsoleAppender
    将日志输出到控制台。

6 EventLogAppender
    将日志写到Windows Event Log. 

7 FileAppender
    将日志写到文件中。

8 LocalSyslogAppender
    将日志写到local syslog service (仅用于UNIX环境下). 
9 MemoryAppender
    将日志存到内存缓冲区。

10 NetSendAppender
    将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。

11 RemoteSyslogAppender
    通过UDP网络协议将日志写到Remote syslog service。

12 RemotingAppender
    通过.NET Remoting将日志写到远程接收端。

13 RollingFileAppender
    将日志以回滚文件的形式写到文件中。

14 SmtpAppender
    将日志写到邮件中。

15 TraceAppender
    将日志写到.NET trace 系统。

16 UdpAppender
    将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。 

三)         Filters

Appender对象将日志以缺省的方式传到输出流,然后Filter可以按照不同的标准控制日志的输出。Filter可以再配置文件中配置。最简单的形式是在appender中写明一个Threshold.这样只有级别大于或等于此Threshold的日志才被记录。

Filters必须实现log4net.Filters.IFilter接口。

四)         Layouts

Layouts控制日志显示的格式样式。日志的显示格式如下:

"%timestamp [%thread] %-5level %logger - %message%newline"

Timestamp: 表示程序已经开始执行的时间。 单位[毫秒]。

Thread:执行当前代码的线程。

Level:日志的级别。

Logger:日志相关请求的名称。

Message: 日志消息。

Layouts还可以控制日志的输出样式,比如以普通形式或以xml等形式输出。

五)         Object Renderers

这是很重要的一项,log4net将按照用户定义的标准输出日志消息。

Object Renders必须实现log4net.ObjectRenderer.IObjectRenerer接口。

三 如何在项目中使用log4net

下面有个基于控制台的demo,举例描述了log4net怎么用于输出日志。
本例中,日志将会记录到文件,控制台,事件日至和Access数据库中。

一)主要代码:

1. 配置文件app.config

 1<?xml version="1.0" encoding="utf-8" ?>
 2<configuration>
 3    <!-- Register a section handler for the log4net section -->
 4    <configSections>
 5        <section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
 6    </configSections>
 7    <appSettings>
 8        <!-- To enable internal log4net logging specify the following appSettings key -->
 9        <!-- <add key="log4net.Internal.Debug" value="true"/> --></appSettings>
10    <!-- This section contains the log4net configuration settings -->
11    <log4net>
12        <!--定义输出到文件中-->
13        <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
14            <!--定义文件存放位置-->
15            <file value="D:\log-file1.txt" />
16            <!-- Example using environment variables in params -->
17            <!-- <file value="${TMP}\log-file.txt" /> -->
18            <!--<sppendToFile value="true" />-->
19            <!-- An alternate output encoding can be specified -->
20            <!-- <encoding value="unicodeFFFE" /> -->
21            <layout type="log4net.Layout.PatternLayout">
22                <!--每条日志末尾的文字说明-->
23                <footer value="[Footer]--Test By Ring1981  " />
24                <!--输出格式-->
25                <conversionPattern value="%date [%thread] %-5level %logger [%ndc] &lt;%property{auth}&gt; - %message%newline" />
26            </layout>            
27        </appender>
28        <!--定义输出到控制台命令行中-->
29        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">            
30            <layout type="log4net.Layout.PatternLayout">
31                <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
32            </layout>
33        </appender>
34        <!--定义输出到windows事件中-->
35        <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
36            <layout type="log4net.Layout.PatternLayout">
37                <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
38            </layout>
39        </appender>
40        <!--定义输出到数据库中,这里举例输出到Access数据库中,数据库为D盘的access.mdb-->
41        <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
42            <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\access.mdb" />
43            <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
44            <!--定义各个参数-->
45            <parameter>
46                <parameterName value="@log_date" />
47                <dbType value="String" />
48                <size value="255" />
49                <layout type="log4net.Layout.PatternLayout">
50                    <conversionPattern value="%date" />
51                </layout>
52            </parameter>
53            <parameter>
54                <parameterName value="@thread" />
55                <dbType value="String" />
56                <size value="255" />
57                <layout type="log4net.Layout.PatternLayout">
58                    <conversionPattern value="%thread" />
59                </layout>
60            </parameter>
61            <parameter>
62                <parameterName value="@log_level" />
63                <dbType value="String" />
64                <size value="50" />
65                <layout type="log4net.Layout.PatternLayout">
66                    <conversionPattern value="%level" />
67                </layout>
68            </parameter>
69            <parameter>
70                <parameterName value="@logger" />
71                <dbType value="String" />
72                <size value="255" />
73                <layout type="log4net.Layout.PatternLayout">
74                    <conversionPattern value="%logger" />
75                </layout>
76            </parameter>
77            <parameter>
78                <parameterName value="@message" />
79                <dbType value="String" />
80                <size value="1024" />
81                <layout type="log4net.Layout.PatternLayout">
82                    <conversionPattern value="%message" />
83                </layout>
84            </parameter>
85        </appender>
86        <!--定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。-->
87        <root>
88            <appender-ref ref="LogFileAppender" />
89            <appender-ref ref="ConsoleAppender" />
90            <appender-ref ref="EventLogAppender" />
91            <appender-ref ref="AdoNetAppender_Access" />
92        </root>
93    </log4net>
94</configuration>
2. LoggingExample.cs

 1// Configure log4net using the .config file
 2[assembly: log4net.Config.XmlConfigurator(Watch=true)]
 3// This will cause log4net to look for a configuration file
 4// called ConsoleApp.exe.config in the application base
 5// directory (i.e. the directory containing ConsoleApp.exe)
 6
 7namespace ConsoleApp
 8{
 9    using System;
10
11    /**//// <summary>
12    /// Example of how to simply configure and use log4net
13    /// </summary>
14    public class LoggingExample
15    {
16        private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
17        
18        public static void Main(string[] args)
19        {
20            log.Error("Error Acc");
21            log.Fatal("Fatle Acc");            
22            System.Console.ReadLine();
23            
24        }
25
26    }
27}
28
运行程序,日志就会以xml中定义的四种媒介形式输出。 

原文地址:https://www.cnblogs.com/30763402/p/1764893.html