65.9K
CodeProject 正在变化。 阅读更多。
Home

log4net XmlConfigurator 简化版

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (15投票s)

2007 年 6 月 16 日

CPOL

5分钟阅读

viewsIcon

96963

downloadIcon

1009

本文介绍了如何使用 XmlConfigurator 配置 log4net。本文还演示了如何为您的应用程序创建多个日志文件。

目录

引言

我们中的许多人都曾为配置 log4net 而挣扎过。我知道在我工作的几乎所有应用程序中,我都复制了一个 log4net 配置文件,然后根据自己的喜好进行了修改。经过一些研究和对 log4net 中可用配置选项的反复试验,我发现了一些有趣的发现。

首先,我们可以根据需要轻松地为每个类、程序集甚至命名空间创建单独的日志文件/Appender。在给出答案之前,我想告诉您一些关于 log4net 库的信息。

定义

log4net 主要由六个对象组成:log4netlog4net.Appenderlog4net.Configlog4net.Filterlog4net.Layoutlog4net.Repository。以下是它们的定义

  • ILog 接口用于记录消息。
  • LogManager 用于记录所有 Logger。Logger 是想要记录数据的对象。
  • Appender 是将日志数据写入某个数据存储、应用程序或库的对象。
  • Filter 是可以应用于 Appender 以限制日志数据写入的条件。
  • Layout 是当日志数据写入 Appender 时使用的显示格式。
  • Repository 是 log4net 配置和 LogManager 的中心存储。

对象之间的关系

每个存储库都有一个 LogManager。每个 LogManager 都有一个或多个 Logger。每个 Logger 都有一个或多个 Appender。每个 Appender 都有一个或多个 Filter 和一个 Layout。

Screenshot - log4net_objects.gif

配置

配置 log4net 最简单、最灵活的方式是使用 XML 文件。log4net 在 log4net.Config.XmlConfigurator 类中提供了 XML 文件的配置读取器。XML 文件由(我所知的)两部分组成。第一部分是一个或多个 Appender 定义,第二部分将 Logger 和 Appender 定义分配给存储库中的 Logger。

<log4net> 元素支持以下属性

Attribute 描述
debug 可选属性。值必须是 truefalse。默认值为 false。将此属性设置为 true 以启用此配置的内部 log4net 调试。
update 可选属性。值必须是 MergeOverwrite。默认值为 Merge。将此属性设置为 Overwrite 以在应用此配置之前重置正在配置的存储库的配置。
threshold 可选属性。值必须是在存储库中注册的级别的名称。默认值为 ALL。将此属性设置为 ALL 可限制整个存储库中记录的消息,而不管消息是记录到哪个 Logger。

<log4net> 元素支持以下子元素

元素 描述
appender 允许零个或多个元素。定义一个 appender
logger 允许零个或多个元素。定义 Logger 的配置。
renderer 允许零个或多个元素。定义一个对象渲染器。
可选元素,最多允许一个。定义根 Logger 的配置。
param 允许零个或多个元素。存储库特定的参数。

Appender 配置

每个 appender 都有不同的配置选项。XML 元素看起来如下

<appender name="rootRollingFile" type="log4net.Appender.RollingFileAppender,log4net">
 <threshold value="ALL"/>
 <param name="File" value="logs/MasterLog"/>
 <param name="AppendToFile" value="true"/>
 <param name="RollingStyle" value="Date"/>
 <param name="DatePattern" value=".yyyy.MM.dd.'log'"/>
 <param name="StaticLogFileName" value="false"/>
 <layout type="log4net.Layout.PatternLayout,log4net">
  <param name="ConversionPattern" value="%date 
	[%-5thread] %-5level %logger - %message%newline %exception"/>
 </layout>
</appender>

<appender> 元素支持以下属性

Attribute 描述
名称 必需属性。值必须是此 appender 的 string 名称。该名称在当前配置文件中定义的所有 appender 中必须是唯一的。此名称由 Logger <appender-ref> 元素用于引用一个 appender
type 必需属性。值必须是此 appender 的类型名称。如果 appender 未在 log4net 程序集中定义,则此类型名称必须是完全程序集限定的。

<appender> 元素支持以下子元素

元素 描述
appender-ref 允许零个或多个元素。允许 appender 引用其他 appender。并非所有 appender 都支持。
过滤器 (filter) 允许零个或多个元素。定义此 appender 使用的 Filter。
layout 可选元素,最多允许一个。定义此 appender 使用的 Layout。
param 允许零个或多个元素。Appender 特定的参数。

将 Appender 分配给 Loggers

有两个元素用于将 Appender 分配给 Logger,分别是 root 和 logger。在这两个元素中,都可以分配两个子 元素levelappender-ref
<level> 元素告诉 log4net 什么日志消息将被发送到此 appender,这相当于 appender 上的 <threshold> 元素。<appender-ref> 元素用于将 appender 分配给特定的 Logger。该元素的格式为 <appender-ref ref="nameOfAppender" />,其中 nameOfAppender 是在 <appender> 元素的 name 属性中指定的名称。

当使用 <root> 元素时,LogManager / Logging Repository 的所有日志消息都将被写入这些 appender
<logger> 元素有一个属性 namename 属性可以是您要为其附加特殊 appender 的命名空间、类或对象名称。通过这种方式,我们可以为每个类或库附加不同的 appender

<root>
 <level value="ALL"/>
 <appender-ref ref="rootTrace"/>
 <appender-ref ref="rootConsole"/>
 <appender-ref ref="rootRollingFile"/>
 <appender-ref ref="rootEventLog"/>
</root>
<logger name="MyCompany">
 <level value="WARN" />
 <appender-ref ref="MyCompany_rollingFile" />
</logger>
<logger name="MyCompany.MultipleClasses">
 <level value="WARN" />
 <appender-ref ref="MyCompany_Multiple_rollingFile" />
</logger>
<logger name="MyCompany.MultipleClasses.Class1">
 <level value="DEBUG" />
 <appender-ref ref="class1File" />
</logger>
<logger name="MyCompany.MultipleClasses.Class2">
 <level value="DEBUG" />
 <appender-ref ref="class2File" />
</logger>
<logger name="MyCompany.MultipleClasses.Class3">
 <level value="DEBUG" />
 <appender-ref ref="class3File" />
</logger>
<logger name="MyCompany.Library1.MyFirstClass">
 <level value="DEBUG" />
 <appender-ref ref="lib1_MyFirstClass_File" />
</logger>
<logger name="MyCompany.Library2.MySecondClass">
 <level value="DEBUG" />
 <appender-ref ref="lib2_MySecondClass_File" />
</logger>
<logger name="MyCompany.Library2.MyThirdClass">
 <level value="DEBUG" />
 <appender-ref ref="lib2_MyThirdClass_File" />
</logger>

考虑到这一点,通过查看上面的配置,我们可以确定以下几点

Logger 名称 信号强度 记录内容 记录到哪个 Appender
MyCompany.
MultipleClasses.
Class3
Debug MyCompany.
MulitpleClasses.Class3
中的任何调试或更高级别的消息。
class3File
MyCompany.
MultipleClasses.
Class2
Debug MyCompany.
MulitpleClasses.Class2
中的任何调试或更高级别的消息。
class2File
MyCompany.
MultipleClasses.
Class1
Debug MyCompany.
MulitpleClasses.Class1
中的任何调试或更高级别的消息。
class1File
MyCompany.Library1.
MyFirstClass
Debug MyCompany.
Library1.MyFirstClass.
中的任何调试或更高级别的消息。
lib1_MyFirstClass
_File
MyCompany.Library2.
MySecondClass
Debug MyCompany.
Library2.MySecondClass
中的任何调试或更高级别的消息。
lib2_MySecondClass
_File
MyCompany.Library2.
MyThirdClass
Debug MyCompany.
Library2.MyThirdClass
中的任何调试或更高级别的消息。
lib2_MyThirdClass
_File
MyCompany.
MulitpleClasses
Warn(警告) MyCompany.
MultipleClasses namespace
中的任何警告消息或更高级别的消息。
MyCompany
_rollingFile
MyCompany Warn(警告) MyCompany 命名空间中的任何警告消息或更高级别的消息
全部 应用程序生成的任何消息。 rootTrace
rootConsole
rootRollingFile
rootEventLog

摘要

我知道这信息量很大。如果您对此文章有任何疑问、想法或评论,请随时告诉我。

参考文献

历史

版本 日期 已完成的工作
1.0 6/16/07 首次发布
© . All rights reserved.