log4net XmlConfigurator 简化版






4.71/5 (15投票s)
本文介绍了如何使用 XmlConfigurator 配置 log4net。本文还演示了如何为您的应用程序创建多个日志文件。
目录
引言
我们中的许多人都曾为配置 log4net 而挣扎过。我知道在我工作的几乎所有应用程序中,我都复制了一个 log4net 配置文件,然后根据自己的喜好进行了修改。经过一些研究和对 log4net 中可用配置选项的反复试验,我发现了一些有趣的发现。
首先,我们可以根据需要轻松地为每个类、程序集甚至命名空间创建单独的日志文件/Appender。在给出答案之前,我想告诉您一些关于 log4net 库的信息。
定义
log4net 主要由六个对象组成:log4net
、log4net.Appender
、log4net.Config
、log4net.Filter
、log4net.Layout
和 log4net.Repository
。以下是它们的定义
ILog
接口用于记录消息。LogManager
用于记录所有 Logger。Logger 是想要记录数据的对象。Appender
是将日志数据写入某个数据存储、应用程序或库的对象。Filter
是可以应用于Appender
以限制日志数据写入的条件。Layout
是当日志数据写入Appender
时使用的显示格式。Repository
是 log4net 配置和LogManager
的中心存储。
对象之间的关系
每个存储库都有一个 LogManager
。每个 LogManager
都有一个或多个 Logger。每个 Logger 都有一个或多个 Appender
。每个 Appender
都有一个或多个 Filter 和一个 Layout。

配置
配置 log4net 最简单、最灵活的方式是使用 XML 文件。log4net 在 log4net.Config.XmlConfigurator
类中提供了 XML 文件的配置读取器。XML 文件由(我所知的)两部分组成。第一部分是一个或多个 Appender
定义,第二部分将 Logger 和 Appender
定义分配给存储库中的 Logger。
<log4net>
元素支持以下属性
Attribute | 描述 |
debug |
可选属性。值必须是 true 或 false 。默认值为 false 。将此属性设置为 true 以启用此配置的内部 log4net 调试。 |
update |
可选属性。值必须是 Merge 或 Overwrite 。默认值为 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。在这两个元素中,都可以分配两个子 元素
:level
和 appender-ref
。<level>
元素告诉 log4net 什么日志消息将被发送到此 appender
,这相当于 appender
上的 <threshold>
元素。<appender-ref>
元素用于将 appender
分配给特定的 Logger。该元素的格式为 <appender-ref ref="nameOfAppender" />
,其中 nameOfAppender
是在 <appender>
元素的 name
属性中指定的名称。
当使用 <root>
元素时,LogManager / Logging Repository 的所有日志消息都将被写入这些 appender
。<logger>
元素有一个属性 name
,name
属性可以是您要为其附加特殊 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. |
Debug | MyCompany. 中的任何调试或更高级别的消息。 |
class3File |
MyCompany. |
Debug | MyCompany. 中的任何调试或更高级别的消息。 |
class2File |
MyCompany. |
Debug | MyCompany. 中的任何调试或更高级别的消息。 |
class1File |
MyCompany.Library1. |
Debug | MyCompany. 中的任何调试或更高级别的消息。 |
lib1_MyFirstClass |
MyCompany.Library2. |
Debug | MyCompany. 中的任何调试或更高级别的消息。 |
lib2_MySecondClass |
MyCompany.Library2. |
Debug | MyCompany. 中的任何调试或更高级别的消息。 |
lib2_MyThirdClass |
MyCompany. |
Warn(警告) | MyCompany. 中的任何警告消息或更高级别的消息。 |
MyCompany |
MyCompany |
Warn(警告) | MyCompany 命名空间中的任何警告消息或更高级别的消息 |
|
根 |
全部 | 应用程序生成的任何消息。 | rootTrace rootConsole rootRollingFile rootEventLog |
摘要
我知道这信息量很大。如果您对此文章有任何疑问、想法或评论,请随时告诉我。
参考文献
历史
版本 | 日期 | 已完成的工作 |
1.0 | 6/16/07 | 首次发布 |