Log4net结构(一)——Logger

本文围绕log4net展开,介绍了Logger代码可复制粘贴到任意类中。还阐述了log4net有5种不同记录方式,存在不同优先级,提供7个等级及布尔属性节省CPU周期。运行时,log4net会检查方法和Logger级别执行操作,还定义了ALL和OFF特殊级别。

Logger

Logger是应用程序与Log4net交互的主要模块。它也是log4net生成日志的消息的模块。Logger主要负责生成日志消息,而不是显示日志消息,关于显示日志消息,在后面的Layout模块会涉及到。

Logger提供了多种方法用于记录任何消息。你能在应用程序中使用多个Logger实例,而把它们的维护工作交给Log4net框架作为“命名实体(Named Entity)”进行维护。这就意味着,你不再需要将应用程序中生成的Logger实例作为参数在应用程序中传递,以便应用的其他模块能使用该实例。你唯一需要做的就是通过Logger的命名来调用它。

目前,Log4net使用类似.Net的命名空间的方式管理命名实体。例如,有两个Logger,分别定义为logger.First.One以及logger.First,那么这两个是不同的Logger,而且logger.First是logger.First.One的祖先,同时logger.First.One继承了logger.First的属性。位于命名空间最高层的Logger是默认Logger,也被成为根Logger(Root Logger),所以上面的例子中logger就是root logger。

如果要实现自己的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 ex);
  
  
bool isDebugEnabled;
  
bool isInfoEnabled;
}


在Logger中,log4net提供了一个名为LogManager的类给我们用于获取/创建一个Logger。LogManager提供了方法GetLogger(),该方法接收一个string类型的参数,用于指定Logger的名称:

log4net.ILog log = log4net.LogManager.GetLogger(”Logger_Name”);

当指定名称的Logger不存在时,LogManager将为我们创建一个。

通常情况下,我们都是使用Logger所在的类的名称来作为Logger的名称,所以我们可以使用如下的方法来传递GetLogger的参数:

System.Reflection.MethodBase.GetCurrentMethod().DeclaringType


尽管上面的代码比typeof(ClassName)要长的多,但是正如log4net的帮助文件所说的,这样做的目的就是能复制、粘贴这段代码到任何一个类中。

Logger Level

从上面的ILog的接口可以看出,log4net有5中不同的记录方式。为什么需要有这5中记录方式呢?其实,这5中记录方式存在不同的优先级别。这些级别定义在log4net.spi.level中。

你可以根据你的需要在应用中使用任意一个方法,但是,你不希望在使用了这些方法之后,在回收时浪费太多的CPU周期。因此,log4net提供了7个等级以及他们各自的布尔属性来节省CPU周期,如下:

Logger的不同等级:

LevelAllow MethodBoolean PropertyValue
OFFHighest
FATALvoid Fatal(...);bool IsFatalEnabled;
ERRORvoid Error(...);bool IsErrorEnabled;
WARNvoid Warn(...);bool IsWarnEnabled;
INFOvoid Info(...);bool IsInfoEnabled;
DEBUGvoid Debug(...);bool IsDebugEnabled;
ALLLowest

在log4net中,每一个Logger会通过配置文件中配置给予一个优先级别,如果没有指定的优先级别,那么它将尝试从它的父类中继承一个优先级别。

同样,Logger的每一个方法都有一个预定义的级别,如上表中列出的,Info()方法有着INFO的级别。

当运行时,log4net会检查方法的级别以及配置文件赋予Logger的级别,然后执行不同的操作。

例如,假设某个Logger具有INFO的级别,那么当执行如下操作时:

Logger.Info(”message”);
Logger.Debug(”message”);
Logger.Warn(”message”);

会有如下的情况:
1、方法Info的级别等于Logger的INFO级别,那么Info方法将执行;
2、方法Debug的级别低于Logger的INFO级别,那么Debug方法将不执行或抛出异常;
3、方法Warn的级别高于Logger的INFO级别,那么Warn方法将被执行。

由此可以看出,当方法的级别大于或等于Logger的级别时,方法将得以执行。

在上表中还定义了两个特殊的级别:ALL和OFF。ALL意味着任何方法都可以执行。OFF则相反。

为了明确那些操作能够执行,可以用上表中的属性进行判断:

if (logger.IsDebugEnabled) 
{
  Logger.Debug(
"message");
}
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、付费专栏及课程。

余额充值