Log4Net笔记(一)基础(转)

最近在好好整理些小组件的使用,本文就Log4Net的使用做一个简单的说明。

准备工作

首先下载log4net相关资源:http://logging.apache.org/log4net/download.html

本文中还使用了NUnit。

log4net的组成

log4net主要由Logger、Appender、Repository、Layout

1)Logger

Logger是log4net主要部分,是来产生日志消息。在log4net中提供了LogManager类来产生ILog:

1.LogManager.GetLogger(LogName)

在ILog提供了:Erro、Info、Debug、Warn四个重载方法来记录日志。

2)Appender

Appender是用来产生日志生成的目的地。Log4Net可以将消息生成到多个目的地,可以轻松通过配置多种Appender组件来实现,当必要的时候我们也可以通过扩张Appender来实现我们需要的截至方式。

3)Repository

Respository用户维护日志对象的结构。除非我们需要扩展log4net时,一般时候是不会用到Respository组件。

4)Layout

Layout是格式化消息输出形式的组件。Layout提供给我们了灵活而又简单消息格式化方式。

log4net消息的级别

级别 对应方法
OFF  
Fatal void Fatal(…)
Error void Error(…)
Warn void Warn(…)
Info void Info(…)
Debug void Debug(…)
All  

消息的级别按照上面的表格由上到下,由高到底的顺序,即OFF>Fatal>Error>Warn>Info>Debug>All。我们可以通过这样的消息的级别进行消息在Appender时进行行AppenderFiter。

配置

log4net的配置可以通过放在新的文件中或者放在程序的配置文件中。而log4net会通过AppDomain.CurrentDomain.BaseDirectory目录下的查找配置文件。<log4net>是log4net查找的标识。先来看我们应用程序的一个配置:

001.<?xml version="1.0" encoding="utf-8" ?>
002.<log4net>
003.    <appender name="LogAllToFile" type="log4net.Appender.FileAppender">
004.        <file value="G:\学习资料\Log4Net\Log4NetDemo\Log4NetDemo\bin\Debug\DemoLog.log"/>
005.        <appendToFile value="true"/>
006.        <!--<layout type="log4net.Layout.PatternLayout">
007.            <conversionPattern value="%d [%t] %-5l - %m%n%n"/>
008.        </layout>-->
009.        <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
010.            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %SysMessage%newline" />
011.        </layout>
012.    </appender>
013.    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
014.        <param name="File" value="log/system_log_"/>
015.        <param name="AppendToFile" value="true"/>
016.        <param name="MaxSizeRollBackups" value="100"/>
017.        <param name="MaximumFileSize" value="1KB"/>
018.        <param name="StaticLogFileName" value="false"/>
019.        <param name="DatePattern" value="yyyyMMdd&quot;.log&quot;"/>
020.        <param name="RollingStyle" value="Date"/>
021.        <!--<layout type="log4net.Layout.PatternLayout">
022.            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
023.        </layout>-->
024.        <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
025.            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %SysMessage%newline" />
026.        </layout>
027.    </appender>
028.    <appender name="ConsoleAppender"
029.              type="log4net.Appender.ConsoleAppender" >
030.        <layout type="log4net.Layout.PatternLayout">
031.            <param name="ConversionPattern"
032.               value="%d [%t] %-5p %c [%x] - %m%n"/>
033.        </layout>
034.    </appender>
035.  
036.  
037.    <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
038.        <!--BufferSize为缓冲区大小-->
039.        <param name="BufferSize" value="1" />
040.        <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
041.        <connectionString value="database=HJRightPlat;server=(local);User ID=sa;Password=123456;" />
042.        <commandText value="INSERT INTO Sys_Log ([Date],[Thread],[Log_Level],[Logger],[Message],[Exception],[User],[Category],[URL],[Client_IP]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception,@User,@Category,@URL,@ClientIp)" />
043.        <parameter>
044.            <parameterName value="@log_date" />
045.            <dbType value="DateTime" />
046.            <layout type="log4net.Layout.RawTimeStampLayout" />
047.        </parameter>
048.        <parameter>
049.            <parameterName value="@thread" />
050.            <dbType value="String" />
051.            <size value="255" />
052.            <layout type="log4net.Layout.PatternLayout">
053.                <conversionPattern value="%thread" />
054.            </layout>
055.        </parameter>
056.        <parameter>
057.            <parameterName value="@log_level" />
058.            <dbType value="String" />
059.            <size value="50" />
060.            <layout type="log4net.Layout.PatternLayout">
061.                <conversionPattern value="%level" />
062.            </layout>
063.        </parameter>
064.        <parameter>
065.            <parameterName value="@logger" />
066.            <dbType value="String" />
067.            <size value="255" />
068.            <layout type="log4net.Layout.PatternLayout">
069.                <conversionPattern value="%logger" />
070.            </layout>
071.        </parameter>
072.        <parameter>
073.            <parameterName value="@message" />
074.            <dbType value="String" />
075.            <size value="4000" />
076.            <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
077.                <conversionPattern value="%SysMessage" />
078.            </layout>
079.        </parameter>
080.        <parameter>
081.            <parameterName value="@exception" />
082.            <dbType value="String" />
083.            <size value="2000" />
084.            <layout type="log4net.Layout.ExceptionLayout" />
085.        </parameter>
086.        <parameter>
087.            <parameterName value="@User" />
088.            <dbType value="String" />
089.            <size value="50" />
090.            <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
091.                <conversionPattern value="%UserName" />
092.            </layout>
093.        </parameter>
094.        <parameter>
095.            <parameterName value="@Category" />
096.            <dbType value="String" />
097.            <size value="50" />
098.            <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
099.                <conversionPattern value="%Category" />
100.            </layout>
101.        </parameter>
102.        <parameter>
103.            <parameterName value="@URL" />
104.            <dbType value="String" />
105.            <size value="50" />
106.            <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
107.                <conversionPattern value="%SysURL" />
108.            </layout>
109.        </parameter>
110.        <parameter>
111.            <parameterName value="@ClientIp" />
112.            <dbType value="String" />
113.            <size value="50" />
114.            <layout type="HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils">
115.                <conversionPattern value="%ClientIP" />
116.            </layout>
117.        </parameter>
118.    </appender>
119.  
120.  
121.  
122.    <root>
123.        <priority value="ALL"/>
124.        <!-- ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF-->
125.        <appender-ref ref="LogAllToFile"/>
126.        <appender-ref ref="ConsoleAppender"/>
127.        <appender-ref ref="RollingLogFileAppender"/>
128.        <appender-ref ref="ADONetAppender"/>
129.    </root>
130.</log4net>

在上面的配置中我们使用了ADONetAppender、LogAllToFile、ConsoleAppender、RollingLogFileAppender四种appender,其中ADONetAppderder中我们使用了些扩展,在后面会详细进行说明。下面说说各个配置节点:

1)Root:在Root中我们可以来指定消息级别,在上面种我们指定为“ALL”,同时我们也可以指定Appender的引用对象。

2)Appender:我们通过Appender配置节点来指定对应的各种方式的Appender,Appender节点可以是多种的。

应用

首先来看我们定义了一个系统消息的实体:

01.public class SysLogMessage
02.{
03.    /// <summary>
04.    /// 用户名
05.    /// </summary>
06.    public string UserName
07.    {
08.        get;
09.        set;
10.    }
11.    /// <summary>
12.    /// 分类
13.    /// </summary>
14.    public string Category
15.    {
16.        get;
17.        set;
18.    }
19.    /// <summary>
20.    /// 访问的Web地址
21.    /// </summary>
22.    public string URL
23.    {
24.        get;
25.        set;
26.    }
27.    /// <summary>
28.    /// 客户端IP
29.    /// </summary>
30.    public string Client_IP
31.    {
32.        get;
33.        set;
34.    }
35.    /// <summary>
36.    /// 消息记录
37.    /// </summary>
38.    public string Message
39.    {
40.        get;
41.        set;
42.    }
43.}

用单件模式定义了一个消息的管理类:

01.public class SysLogManager
02.{
03.    #region Thread-safe, lazy Singleton
04.    SysLogManager() { this.InitLogManager(); }
05.    public static SysLogManager Instance {
06.        get {
07.            return Nested.LogManager;
08.        }
09.    }
10.    private class Nested {
11.        static Nested() { }
12.        internal static readonly SysLogManager LogManager = new SysLogManager();
13.    }
14.    private void InitLogManager()
15.    {
16.        XmlConfigurator.Configure(BaseDataCache.log4netConfig);
17.        _Log = LogManager.GetLogger(LogName);
18.          
19.    }
20.    #endregion
21.    #region Help Methods And Fileds
22.    ILog _Log;
23.    string LogName = "HJRightLog";
24.    #endregion
25.    public void Erro(SysLogMessage msg)
26.    {
27.        _Log.Error(msg);
28.    }
29.    public void Erro(SysLogMessage msg, Exception e)
30.    {
31.        _Log.Error(msg, e);
32.    }
33.    public void Info(SysLogMessage msg)
34.    {
35.        _Log.Info(msg);
36.    }
37.    public void Info(SysLogMessage msg, Exception e)
38.    {
39.        _Log.Info(msg, e);
40.    }
41.    public void Debug(SysLogMessage msg)
42.    {
43.        _Log.Debug(msg);
44.    }
45.    public void Debug(SysLogMessage msg, Exception e)
46.    {
47.        _Log.Debug(msg, e);
48.    }
49.    public void Warn(SysLogMessage msg)
50.    {
51.        _Log.Warn(msg);
52.    }
53.    public void Warn(SysLogMessage msg, Exception e)
54.    {
55.        _Log.Warn(msg, e);
56.    }
57.}

看看测试代码:

01.[Test]
02.public void TestLogErro()
03.{
04.    _logM.Erro(new SysLogMessage{
05.        Message="测试",
06.        UserName="Henllyee",
07.        Category="Debug",
08.        URL="http://henllyee.cnblogs.com"
09.    });
10.      
11.}

结果:

ConsleAppender:

image

RollingLogFileAppender:

image

AdoNetAppender:

image

 

 

 

总结

本文中概括地介绍了下log4net的使用,在下篇的文章中将会详细说明下多个常用的Appender。

转自:http://www.cnblogs.com/Henllyee/archive/2010/01/24/1655206.html

posted @ 2010-03-01 19:54  catch22  阅读(361)  评论(0编辑  收藏  举报