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 
Fatalvoid Fatal(…)
Errorvoid Error(…)
Warnvoid Warn(…)
Infovoid Info(…)
Debugvoid 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. }

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

1.   
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。

1、概述 log4net是.Net下一个非常优秀的开源日志记录组件。log4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。本文主要是介绍如何在Visual Studio2008中使用log4net快速创建系统日志,如何扩展以输出自定义字段。 2、一个简单的使用实例 第一步:在项目中添加对log4net.dll的引用,这里引用版本是1.2.10.0。 第二步:程序启动时读取log4net的配置文件。 如果是CS程序,在根目录的Program.cs中的Main方法中添加: log4net.Config.XmlConfigurator.Configure(); 如果是BS程序,在根目录的Global.asax.cs(没有新建一个)中的Application_Start方法中添加: log4net.Config.XmlConfigurator.Configure(); 无论BS还是CS程序都可直接在项目的AssemblyInfo.cs文件里添加以下的语句: [assembly: log4net.Config .XmlConfigurator()] 也可以使用自定义的配置文件,具体请参见4.4 关联配置文件。 第三步:修改配置文件。如果是CS程序,则在默认的App.config文件(没有新建一个)中添加内容;如果是BS程序,则添加到Web.config文件中,添加内容一样,这里不再列出。 App.config文件添加内容如下: <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <log4net> <root> <level value="WARN" /> <appender-ref ref="LogFileAppender" /> <appender-ref ref="ConsoleAppender" /> </root> <logger name="testApp.Logging"> <level value="DEBUG"/> </logger> <appender name="LogFileAppender" type="log4net.Appender.FileAppender" > <param name="File" value="log-file.txt" /> <param name="AppendToFile" value="true" /> <layout type="log4net.Layout.PatternLayout"> <param name="Header" value="[Header] "/> <param name="Footer" value="[Footer] "/> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="DEBUG" /> <param name="LevelMax" value="WARN" /> </filter> </appender> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" > <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /> </layout> </appender> </log4net> </configuration> 第四步:在程序使用。 log4net.ILog log = log4net.LogManager.GetLogger("testApp.Logging");//获取一个日志记录器 log.Info(DateTime.Now.ToString() + ": login success");//写入一条新log 这样就将信息同时输出到控制台和写入到文件名为“log-file.txt”的文件中,其中“log-file.txt”文件的路径是当前程序运行所在目录;也可以定义为绝对路径,配置如: <param name="File" value="C:/log-file.txt" />就写入C盘根目录下log-file.txt文件中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值