Log4net学习心得

Log4net学习心得

 

最近在学习log4net,下面是我的一些学习心得,把它写下来与大家分享一下。

 

1、      Log4net概述:

log4net.Net下一个非常优秀的开源日志记录组件。log4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出到不同的媒介。本文主要是介绍如何在Visual Studio2010WPF项目中使用log4net快速创建系统日志。

2、      Log4net详解:

2.1  log4net的组成。

log4net主要由LoggerAppenderRepositoryLayoutFilter组成。

1Logger

Loggerlog4net主要部分,该元素预定义了一个具体日志对象的设置,是来产生日志消息。在log4net中提供了LogManager类来产生ILog

LogManager.GetLogger(LogName)ILog提供了:ErroInfoDebugWarn四个重载方法来记录日志。

2Appender

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

3Repository

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

4Layout

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

%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息

%n(new line):换行

%d(datetime):输出当前语句运行的时刻

%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数

%t(thread id):当前语句所在的线程ID

%p(priority): 日志的当前优先级别,即DEBUGINFOWARN…

%c(class):当前日志对象的名称,

%L:输出语句所在的行号

%F:输出语句所在的文件名

%-数字:表示该项的最小长度,如果不够,则用空格填充

每个Appender节点里面只能有一个Layout节点。

5Filter

Appender元素里的filter标签。它定义了应用到Appender对象的过滤器。本例中,我们使用了LevelRangeFilter过滤器,它可以只记录LevelMinLevelMax参数指定的日志级别之间的日志事件。可以在一个Appender上定义多个过滤器(Filter,这些过滤器将会按照它们定义的顺序对日志事件进行过滤。

2.2  log4net消息的级别:

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

只有当方法的级别高于日志级别时,日志请求才会被接受并执行。举例说明,当你创建了一个日志对象,并且把他的级别设置为INFO。于是框架会设置日志的每个Boolean属性。当你调用相应的日志方法时,框架会检查相应的Boolean属性,以决定该方法能不能执行。如下的代码:

Logger.Info("message");

Logger.Debug("message");

Logger.Warn("message");

对于第一种方法,Info()的级别等与日志的级别(INFO),因此日志请求会被传递,我们可以得到输出结果”message”

对于第二种方法,Debug()的级别低于日志对象logger的日志级别(INFO),因此,日志请求被拒绝了,我们得不到任何输出。同样的,针对第三行语句,我们可以很容易得出结论:仍然得不到任何输出。

另外还有两个特殊的级别:ALLOFFALL表示允许所有的日志请求。OFF是拒绝所有的请求。

3、     Log4net应用:

3.1  下载log4net.dll文件

下载地址:http://logging.apache.org/log4net/

3.2  在应用程序进行相关配置。

 1)首先需要在程序集级别的文件中(AssemblyInfo.cs)修改配置。无论BS还是CS程序都可直接在项目的AssemblyInfo.cs文件里添加以下的语句:

[assembly: log4net.Config .XmlConfigurator()]

或者:[assembly:log4net.Config.XmlConfigurator(ConfigFile="filename",ConfigFileExtension="txt",Watch=true)]

{注释:

ConfigFile 如果指定,XmlConfigurator将使用该配置文件,文件的路径是相对应用项目的根目录(AppDomain.CurrentDomain.BaseDirectory),也可以是绝对路径。该属性不能与“ConfigFileExtension”属性一起使用。

ConfigFileExtension 如果指定,将对配置文件进行扩展。程序集的名字将追加到扩展文件名里,作为基本的名字。例如,如果程序集是从TestApp.exe文件中加载,并且log4net设置了ConfigFileExtension属性,则配置文件的名字是“TestApp.exe.log4net”,这相当于给TestApp.exe.log4net设置了ConfigFile属性。

配置文件将编译输出到项目根目录(AppDomain.CurrentDomain.BaseDirectory),程序集名和配置文件扩展名就是该配置的名字。

这个属性不能与ConfigFile属性一起使用。

Watch 如果指定并设置为“True”,那么框架将监视配置文件,每次配置修改将重新加载。

如果既没有指定ConfigFile, 也没有指定ConfigFileExtension,项目默认配置文件(例如:TestApp.exe.config)将作为log4net的配置文件。}

2)在配置文件中修改配置。

如果是CS程序,则在默认的App.config文件(没有新建一个)中添加内容;如果是BS程序,则添加到Web.config文件中,添加内容一样。模式如下:

<configSections>

            <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

        </configSections>

        <log4net>

            <root>

                <level value="WARN" />

                <appender-ref ref="LogFileAppender" />

                <appender-ref ref="ConsoleAppender" />

                <appender-ref ref="LogAllToFile" />

                <appender-ref ref="AdoNetAppender" />

            </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="AdoNetAppender" type="log4net.Appender.AdoNetAppender">

            <bufferSize value="1" />

            <connectionType value="System.Data.SqlClient.SqlConnection, System.Data,Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

            <connectionString value="Data Source=.;Initial Catalog=HJRightPlat;User ID=sa;Password=123456" />

            <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />

            <parameter>

                <parameterName value="@log_date" />

                <dbType value="DateTime" />

                <layout type="log4net.Layout.RawTimeStampLayout" />

            </parameter>

            <parameter>

                <parameterName value="@thread" />

                <dbType value="String" />

                <size value="255" />

                <layout type="log4net.Layout.PatternLayout">

                    <conversionPattern value="%thread" />

                </layout>

            </parameter>

            <parameter>

                <parameterName value="@log_level" />

                <dbType value="String" />

                <size value="50" />

                <layout type="log4net.Layout.PatternLayout">

                    <conversionPattern value="%level" />

                </layout>

            </parameter>

            <parameter>

                <parameterName value="@logger" />

                <dbType value="String" />

                <size value="255" />

                <layout type="log4net.Layout.PatternLayout">

                    <conversionPattern value="%logger" />

                </layout>

            </parameter>

            <parameter>

                <parameterName value="@message" />

                <dbType value="String" />

                <size value="4000" />

                <layout type="log4net.Layout.PatternLayout">

                    <conversionPattern value="%message" />

                </layout>

            </parameter>

            <parameter>

                <parameterName value="@exception" />

                <dbType value="String" />

                <size value="2000" />

                <layout type="log4net.Layout.ExceptionLayout" />

            </parameter>

        </appender>

        </log4net>

{注释:

所有的配置都要在<log4net>元素里定义。

<log4net>支持的属性:

debug 可选,取值是truefalse,默认是false。设置为true,开启log4net的内部调试。

update 可选,取值是Merge(合并)Overwrite(覆盖),默认值是Merge。设置为Overwrite,在提交配置的时候会重置已经配置过的库

threshold 可选,取值是repository(库)中注册的level,默认值是ALL

支持的子元素:appender  1或多个、logger 0或多个、renderer 0或多个 root 最多一个、param 0或多个。

<root>

实际上就是一个根logger,所有其它logger都默认继承它,如果配置文件里没有显式定义,则框架使用根日志中定义的属性。root元素没有属性。支持的子元素:appender-ref 0个或多个,要引用的appender的名字、level最多一个。 只有在这个级别或之上的事件才会被记录param  0个或多个, 设置一些参数。

rootappender-ref子元素中,必须指定它要输出的appender。否则日志不会输出到该appender指定的目的地。

<logger>

支持的属性:name  必须的,logger的名称、additivity可选,取值是truefalse,默认值是true。设置为false时将阻止父logger中的appender

支持的子元素:appender-ref 0个或多个,要引用的appender的名字、level最多一个。 只有在这个级别或之上的事件才会被记录、param0个或多个,设置一些参数。

<appender>

定义日志的输出方式,只能作为 log4net 的子元素。name属性必须唯一,type属性必须指定。

支持的属性:name  必须的,Appender对象的名称、type 必须的,Appender对象的输出类型

支持的子元素:appender-ref  0个或多个,允许此appender引用其他appender,并不是所以appender类型都支持、filter  0个或多个,定义此app使用的过滤器、layout  最多一个。定义appender使用的输出格式、param 0个或多个,设置Appender类中对应的属性的值。

Appender有多种输出方式:

1 AdoNetAppender
    
将日志记录到数据库中。可以采用SQL和存储过程两种方式。

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

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

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

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

6 EventLogAppender
    
将日志写到Windows Event Log. 

7 FileAppender
    
将日志写到文件中。

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

9 MemoryAppender
    
将日志存到内存缓冲区。

10 NetSendAppender

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

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

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

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

14 SmtpAppender
    
将日志写到邮件中。

<layout>

布局,只能作为<appender>的子元素。

支持的属性:type必须的,Layout的类型

支持的子元素param 0个或多个,设置一些参数

<filter>

过滤器,只能作为<appender>的子元素。

支持的属性:type必须的,Filter的类型

支持的子元素:param 0个或多个,设置一些参数

}

3.3  在应用程序进行应用日志文件。

         1获取日志记录器。有三种方法:

        private static log4net.ILog oldLog = LogManager.GetLogger("testApp.Logging");

        private static log4net.ILog logger = LogManager.GetLogger(typeof(Program));

 private static readonly log4net.ILog logs = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

            2)写入日志

            logs.Error("Error Acc logs");

            logs.Warn("Warn Acc logs");

            logs.Info("Info Acc logs");

            logs.Debug("Debug Acc logs");

 

            logger.Error("Error Acc logger");

            logger.Warn("Warn Acc logger");

            logger.Info("Info Acc logger");

            logger.Debug("Debug Acc logger");

 

            oldLog.Error("Error Acc oldLog");

            oldLog.Warn("Warn Acc oldLog");

            oldLog.Info("Info Acc oldLog");

            oldLog.Debug("Debug Acc oldLog");

           

        不过由于本例中只配置了两个ApperderLogFileAppenderAdoNetAppender

    所以日志只能保存到log-file.txt文件和数据库中。

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值