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的大致结构如下:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
在Logger中,log4net提供了一个名为LogManager的类给我们用于获取/创建一个Logger。LogManager提供了方法GetLogger(),该方法接收一个string类型的参数,用于指定Logger的名称:
![](/Images/OutliningIndicators/None.gif)
当指定名称的Logger不存在时,LogManager将为我们创建一个。
通常情况下,我们都是使用Logger所在的类的名称来作为Logger的名称,所以我们可以使用如下的方法来传递GetLogger的参数:
![](/Images/OutliningIndicators/None.gif)
尽管上面的代码比typeof(ClassName)要长的多,但是正如log4net的帮助文件所说的,这样做的目的就是能复制、粘贴这段代码到任何一个类中。
Logger Level
从上面的ILog的接口可以看出,log4net有5中不同的记录方式。为什么需要有这5中记录方式呢?其实,这5中记录方式存在不同的优先级别。这些级别定义在log4net.spi.level中。
你可以根据你的需要在应用中使用任意一个方法,但是,你不希望在使用了这些方法之后,在回收时浪费太多的CPU周期。因此,log4net提供了7个等级以及他们各自的布尔属性来节省CPU周期,如下:
Logger的不同等级:
Level | Allow Method | Boolean Property | Value |
OFF | Highest | ||
FATAL | void Fatal(...); | bool IsFatalEnabled; | |
ERROR | void Error(...); | bool IsErrorEnabled; | |
WARN | void Warn(...); | bool IsWarnEnabled; | |
INFO | void Info(...); | bool IsInfoEnabled; | |
DEBUG | void Debug(...); | bool IsDebugEnabled; | |
ALL | Lowest |
在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则相反。
为了明确那些操作能够执行,可以用上表中的属性进行判断:
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)