在.Net中使用log4Net

1:写在前面:

     由于最近在项目中用到了log4Net,所以拿来和大家分享一下,我们都知道在开发项目中,大家有可能会用到日志功能,记录日志的方法很多,在.net中微软为我们提供了EntLib(Enterprise library ) Logging Application Block日志记录模块;另外我们也可以使用Apache的log4net日志模块,当然了我们也可以用自己的方法来记录日志,不管使用什么方法来记录日志,我们的目的就是在项目部署以后,能够很快定位程序中的bug,提高我们解决bug效率。了解整个系统的运行情况,因为我们在开发阶段我们可以通过调试来检查bug,一旦程序部署了以后,使用这种方法也许不太可能了。所以日志是我们找出原因的最佳路径,由于log4net支待多平台,且运行效率要比EntLib来的高,不过据说log4Net已以很久没有更新了,我们暂且不关注这个。本文部分内容翻译于http://logging.apache.org/log4net.

2:Log4net DLL

要想在我们的项目中能够使用Log4net ,我们需要引用Log4net dll文件,这个文件我们可以从官方站下载

http://logging.apache.org/log4net/download.html    这是一个solution需要编译后才可以产生dll文件.

以可以从CSDN上下载:

http://download.csdn.net/source/839743

3:Log4Net的特性

Support for multiple frameworks(目前好像只有1.0.1.1,2.0的版本,没有3.5的)
Output to multiple logging targets
Hierarchical logging architecture
XML Configuration
Dynamic Configuration(可以在程序运行的时候修改配置文件)
Logging Context
Proven architecture
Modular and extensible design
High performance with flexibility

4:Log4Net的结构:

Log4net有三个主要的组件,他们分别是:loggers,appenders and layouts。

Logger是最主要的组件,它用来产生日志消息。日志需要经过Layout的格式化处理后才会输出。就类似于文件流,Logger就是用来产生文件流的,Layout就是定义文件流输出的格式,是二进制流还是Xml等等. appenders 就类似于输出文件流,文件流的位置,如控制台还是文本等等.所以理解这三者的关系后,我们就可以使用Log4Net了.Logger提供了多种方式来记录一个日志消息,你可以在你的应用程序里创建多个Logger,每个实例化的Logger对象都被log4net框架作为命名实体来维护。这意味着为了重用Logger对象,你不必将它在不同的类或对象间传递,只需要用它的名字为参数调用就可以了。Log4net框架定义了一个ILog接口,所有的logger类都必须实现这个接口。ILog接口的部分代码定义如下:

public interface ILog

{

void Debug(object message);

void Info(object message);

void Warn(object message);

void Error(object message);

void Fatal(object message);

void Debug(object message, Exception t);

void Info(object message, Exception t);

void Warn(object message, Exception t);

void Error(object message, Exception t);

void Fatal(object message, Exception t);

void DebugFormat(string format, params object[] args);

void InfoFormat(string format, params object[] args);

void WarnFormat(string format, params object[] args);

void ErrorFormat(string format, params object[] args);

void FatalFormat(string format, params object[] args);...................... 其他的就不列出来了

}

Layout的转换模式:

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

%n(new line):换行

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

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

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

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

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

模式字符串为:%-10c -%m%n

代码为:

ILog log=LogManager.GetLogger(“Exam.Log”);

log.Debug(“Hello”);

则输出为下面的形式:

Exam.Log - Hello

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

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

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

Log4net定义了一个叫做LogManager的类,用来管理所有的logger对象。它有一个GetLogger()静态方法,用我们提供的名字参数来检索已经存在的Logger对象。如果框架里不存在该Logger对象,它也会为我们创建一个Logger对象。代码如下所示:

log4net.ILog log = log4net.LogManager.GetLogger(Typeof(className));

通常来说,我们会以类(class)的类型(type)为参数来调用GetLogger(),以便跟踪我们正在进行日志记录的类。传递的类(class)的类型(type)可以用typeof(Classname)方法来获得,或者可以用如下的反射方法来获得:

System.Reflection.MethodBase.GetCurrentMethod().DeclaringType

日志的级别:

Loggers 日志的级别.就如上面的接口中定义的一样

  • ALL
  • DEBUG  void Debug(object message); ..
  • INFO     void Info(object message); ..
  • WARN  void Warn(object message); ..
  • ERROR  void Error(object message); ...
  • FATAL void Fatal(object message); ...
  • OFF

每一个级别都有一个对应的Boolean属性,用于检查logger日志的级别

值的一提的是:ILog接口的每个方法都有一个预先定义好了的级别值。ILog的Debug()方法具有Debug级别。同样的,以此类推.当我们使用以上的任何一种方法时,log4net框架会检查日志对象logger的级别和方法的级别。只有当方法的级别高于日志级别时,日志请求才会被接受并执行.如果没有会Logger设置级别的话,默认会从父级别中继承一个级别值。下面是简单的示例:

<root>

<level value="WARN" />

<appender-ref ref="LogFileAppender" />

<appender-ref ref="ConsoleAppender" />

</root>

<logger name="log">

<level value="INFO"/>//如果没有设置的话,默认继续之Root.

</logger>

log.Logging.Info("message");系统会自动检查级别,因为方法的级别和日志的级别是一个等级的,所以可以正常调用.

log.Logging.Debug("message");//因为Debug的方法比日志定义的级别低,所以不能正常调用.即没有任何输出.

ALL和OFF。ALL表示允许所有的日志请求。OFF是拒绝所有的请求。

你也可以显式地检查Logger对象的Boolean属性,如下所示:

if (log.IsDebugEnabled)

{

log.Debug("message");

}

4:Solutio结构:

log4Net

为了能够使用Log4Net.我们先得引用Log4net.dll文件

在我的App.config中加入以下代码:

<configSections>
    <section name="log4net"
      type="log4net.Config.Log4NetConfigurationSectionHandler, log4net-net-1.0"
    />
  </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" />//这样会在你的项目的debug目录下产生log-file.txt文件
      <param name="AppendToFile" value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="Header" value="[Header]\r\n"/>
        <param name="Footer" value="[Footer]\r\n"/>
        <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>

修改我们的AssemblyInfo.cs文件:

在AssemblyInfo.cs中加入一段代码:

[assembly: log4net.Config.DOMConfigurator()]这样程序会自动到App.config文件中找到<log4net>的结点,获取到相关信息.当然我也指定配置文件名等,我们就需要使用:[assembly:log4net.Config.DOMConfigurator(ConfigFile="filename", ConfigFileExtension="ext",Watch=true/false)]

ConfigFile:指出了我们的配置文件的路径及文件名,包括扩展名。

ConfigFileExtension:如果我们对被编译程序的程序集使用了不同的文件扩展名,那么我们需要定义这个属性,缺省的,程序集的配置文件扩展名为”config”。

Watch (Boolean属性): log4net框架用这个属性来确定是否需要在运行时监视文件的改变。如果这个属性为true,那么FileSystemWatcher将会被用来监视文件的改变,重命名,删除等事件。

logTesting

程序中的代码:

log4net.ILog log = log4net.LogManager.GetLogger("testApp.Logging");

private void btnTest_Click(object sender, EventArgs e)
{
          log.Error("Tesing only");
}

输出的结果如下:

[Header]
2008-12-04 17:14:18,458ate [4100hread] Log4Net.Form1.btnTest_Click(C:\Users\John\Documents\Visual Studio 2008\Projects\Project1\Log4Net\Log4Net\Form1.cs:24)evel Log4Net.Form1.btnTest_Click(C:\Users\John\Documents\Visual Studio 2008\Projects\Project1\Log4Net\Log4Net\Form1.cs:24)ogger [dc] - Testing only

转载于:https://www.cnblogs.com/liujiang/archive/2008/12/05/1348305.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值