log4Net 教程

学习log4Net需要多长时间,1天吗?如果只是使用它,我希望是十分钟。希望这篇关于log4Net的介绍能让你在十分钟里实现你的目的。

工程中的代码我扩展了log4net的字段,又添加了两个,然后将日志写入数据库和文本文件。用一个rollingFileappender将log4Net的字段和我扩展的地段同时写入文件是要点,请留意layout节点的设置。

演示工程链接:http://download.csdn.net/detail/neo2616/4242028 下载需要2分 ^_^ 

Log4net教程

 

一、log4net 使用步骤:

 

1、添加log4net.dll引用和命名空间“using log4net;”。

2、配置“XML”:

第一种方法:在“App.config”添加“<configuration>”节点。

第二种方法:用户创建一个Xml文件

[assembly:log4net.Config.XmlConfigurator(ConfigFile="log4net.config",Watch=true)]

log4net.config 是配置文件的名称,可以自行设置

Watch 是表示在程序运行期间是否监视该配置文件的变动。

第二种方法推荐采用。

3、加载“App.config”中配置的<configuration>”节点:在文件“AssemblyInfo.cs”文件末尾添加“[assembly:log4net.Config.XmlConfigurator()]”(此构造方法可以任意指定xml配置文件路径,无参数会使用系统文件“App.config”)。

4、创建日志对象,一般定义为一个类的私有静态字段

private static readonly ILog log = LogManager.GetLogger(typeof(类名).Name);

private static readonly ILog log = LogManager.GetLogger(“日志名”);

 

5、写日志

if (log.IsDebugEnabled)

{

    log.Debug("日志信息");

}

二、log4net总体介绍:

 

log4net是log4net配置节的根标记。root标记定义一个根级别的记录者,log4net的记录者采用层级组织的, 每一个LOGGER(ROOT也是一个LOGGER,只不过,他是祖先而已,别的方面,跟其他LOGGER一样)。log4net的架构分为四个要素:logger,appender,layout,filter。

logger是负责日志的记录者,

appender提供记录的介质,

  layout负责把记入的内容格式化,

  filter负责把内容进行筛选,

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

1、   日志等级:

日志等级分为:(Unrecoverableerrors,Recoverableerrors,Information,Debug)不可恢复的错误一定要记录下来,用户不可轻易删除,以便于开发人员分析处理。可恢复的错误,也要记录,并提供处理措施,应有查看及分析工具支持。调试日志,用来供开发人员和维护人员跟踪操作流程以及分析问题,平时需要屏蔽,仅在相关维护人员跟踪问题时再临时开放日志权限。 

级别

允许的方法

Boolean属性

优先级别

分类

OFF

 

 

Highest

 

FATAL

void Fatal(...);

bool IsFatalEnabled;

 

Unrecoverable

RROR

void Error(...);

bool IsErrorEnabled;

 

Recoverable

WARN

void Warn(...);

bool IsWarnEnabled;

 

INFO

void Info(...);

bool IsInfoEnabled;

 

Information

DEBUG

void Debug(...);

bool IsDebugEnabled;

 

Debug

ALL

 

 

Lowest

 

(注意:如果你定义INFO,那么低于INFO级别以下的信息,将不会记入日志。就是说,就算你在程序里,用log.debug()来写入一个日志信息,可是你在配置中指定level为INFO,由于DEBUG级别低于INFO,所以,不会被记入日志)。

2、   Appender-ref:

Logger还有一个配置就是appender-ref了,ref是参照的意思。

 

三、appender:

 

在log4net的配置中,appender是最重要的部分,一般来说,每一种appender都表示一种日志的输出介质,如日志文件、EvengLog、数据库、控制台、邮件、网络等十六种。下面以两种为例:AdoNetAppender,RollingFileAppender,分别把日志记入文本文件和Access数据库

 

1、  文本数据库:

文本日记文件可以按时间生成或按大小生成,二者选择一个,如果二者同时需要,可以在代码重写appender。

 样例代码:

 <!--同时使用时间控制文件和大小控制文件生成-->
    <!--RollingLogFileAppender1 里输出系统字段-->
    <appender name="RollingLogFileAppender1" type="log4net.Appender.RollingFileAppender">
      <!--<file value="log/log.txt"/>-->
      <!--<file name="Client.Logging" value="log/log" />-->
      <file value="log/log" />
      <!--是否覆盖,默认是追加true-->
      <appendToFile value="true"/>
      <!--并发控制-->
      <lockingModel type="log4net.Appender.RollingFileAppender+MinimalLock" />
      <!--设置无限备份=-1 ,日志文件上限-->
      <maxSizeRollBackups value="1000"/>
      <!--每个文件的最大?k-->
      <maximumFileSize value="10KB"/>
      <!--名称是否可以更改为false为可以更改-->
      <param name="StaticLogFileName" value="false" />
      <!--文件名称-->
      <!--value="yyyyMMdd-HHmm" 表示按分钟生成文件
      value="yyyyMMdd" 表示按天生成文件-->
      <param name="DatePattern" value="yyyyMMdd&quot;.txt&quot;" />
      <param name="RollingStyle" value="Composite" />
    
      <layout type="log4net.Layout.PatternLayout+WindowsFormsApplication2.log.CustomLayout2">
        <param name="ConversionPattern" value="[时间]:%d%n[级别]:%p%n[新加字符串]:%UserName%n[新加整形]:%Category%n[内容]:%Message%n%n" />
      </layout>
     
    </appender>

2        Access数据库:

 样例代码:

<!--记录日志到数据库-->

   <appendername="ADONetAppender" type="log4net.Appender.ADONetAppender">

     <!--BufferSize为缓冲区大小-->

                     <paramname="BufferSize" value="10" />

     <connectionString  value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=./db1.mdb;"   />

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

     <parameter>

       <parameterName value="@log_date" />

       <dbType value="String" />

       <size value="255" />

       <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">

          <conversionPatternvalue="%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="255" />

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

         <conversionPattern value="%message" />

       </layout>

     </parameter>

     <parameter>

       <parameterName value="@exception" />

       <dbType value="String" />

       <size value="255" />

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

     </parameter>

     <parameter>

       <parameterName value="@User" />

       <dbType value="String" />

       <size value="50" />

       <layout type="Log4NetToDatabase.CustomLayout">

         <conversionPattern value="%UserName" />

       </layout>

     </parameter>

     <parameter>

       <parameterName value="@Category" />

       <dbType value="String" />

       <size value="50" />

       <layout type="Log4NetToDatabase.CustomLayout">

         <conversionPattern value="%Category" />

       </layout>

     </parameter>

</appender>

 

注意:1  Access数据类型的时间字段建议使用字符串类型。

         2  根据实际设置BufferSize参数以改善性能。比如10。

 

四、控制“log4net.Layout.PatternLayout”输出样式

 

一、常用输出格式

%c   列出logger名字空间的全称,如加上{<层数>}表示出从最内层算起的指定层数的名字空间

%X  按MDC(Mapped Diagnostic Context,线程映射表)输出日志。通常用于多个客户端连接同一台服务器,方便服务器区分是那个客户端访问留下来的日志。

%d  %d{<日期格式>}:日志信息产生时间,使用ISO8601定义的日期格式

%l    输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数

%L   显示调用logger的代码行

%M   显示调用logger的方法名

%d, %date :表示当前的时间

%level :表示日志的级别

%logger, %c:表示日志产生的主题,通常是所在的类名,便于定位问题

%t, %thread:表示 所在进程

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

%n(new line):换行

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

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

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

%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等

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

%f(file):输出语句所在的文件名。

%l(line):输出语句所在的行号。

%数字:表示该项的最小长度,如果不够,则用空格填充,如“%-5level”表示level的最小宽度是5个字符,如果实际长度不够5个字符则以空格填充。

下面以一个实际的例子来说明问题,比如在配置中有“te [%thread] (%file:%line) %-5level %logger [%property{NDC}] -%message%newline”,那么实际的日志中会是如下格式:

“记录时间:2010-11-1716:16:36,561 线程ID:[9] 日志级别:文件:所在行ERROR 出错类:Log4NetDemo.Programproperty:[(null)] - 错误描述:error

System.Exception: 在这里发生了一个异常,Error Number:2036084948”

 

五、

 

LOGGER的定义是非必须的,只是一种建议罢了,Log4net的配置中,除了必须定义一个ROOT和一个APPENDER外,其他的都是可选的。

 

六、如何防止自定义的logger和root重复写入日志?

 

logger是从root继承而来,默认的用logger写的日志会被root重复写一份,如何防止这种情况呢,可以去掉root里的 appender-ref,这不是一个好的解决方法,logger只是为了单独处理一些日志,大部分的日志还是要依靠root来完成。其实log4net提供了一种很好的解决方式,断开logger与root的继承关系,只要在配置文件里的logger加上属性additivity="false"就可以了(例<loggername="MyLogger" additivity="false" >)。

 

七、log4net的文档建议:

 

如果你不想你的日志文件变得很大,使读写的性能下降的话,建议你还是分级管理日志,把粒度变小点,也就是说,除了定义ROOT外,最后,对每一个模块或每一个实体,依据用途,目的,定义各自的LOGGER配置,这样的好处是日志被分散了,日志文件增长就没那么快了.每一个LOGGER的结构跟ROOT是一模一样的,

 

八、附带演示工程说明:

 

1.        文本日志同时可以按大小和日期控制生成新文件

2.        工程中的log文件夹是为新添加的字段(Username(string),Category(int))而写的几个类,当系统已有的字段message我也重写了,如果不这样的话message 的数据是日志参数的类名。

3.        配置文件里有两个日志对象。分别是MyLogger用于输入到数据库,和FileLogger 用于输入日志到文件。

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值