Log For log4net (二) — 配置特性与配置文件

Friday, April 27, 2007

上篇

注:Attribute译为“特性”,Property译为“属性”

原文地址:log4net Manual - Configuration

配置特性

log4net除可以通过编程配置外还可以利用组件级别的特性进行配置

XmlConfiguratorAttribute

log4net.Config.XmlConfiguratorAttribute允许通过下列属性对XmlConfigurator进行配置。

configFile:指定对XmlConfigurator进使用的配置文件名,文件路径相对于程序的根文件夹(AppDomain.CurrentDomain.BaseDirectory)

ConfigFileExtension:指定配置文件的扩展名,组件集文件名加上指定的扩展名通常即配置文件名。例如从TestApp.exe中读取的组件制定ConfigFileExtension属性为log4net,则配置文件名为TestApp.exe.log4net。其效果与制定configFile属性为TestApp.exe.log4net相同。

配置文件的路径为程序根文件夹(AppDomain.CurrentDomain.BaseDirectory)。

这个属性不能与configFile属性一起使用。

Watch:如果这个属性设为true,程序将会监视配置文件并在文件变化时重新载入配置。

如果configFile和ConfigFileExtension属性均没有指定,log4net将会使用应用程序配置文件(例如TestApp.exe.config)

示例用法

   1: // Configure log4net using the .config file
   2: [assembly: log4net.Config.XmlConfigurator(Watch=true)]
   3: // This will cause log4net to look for a configuration file
   4: // called TestApp.exe.config in the application base
   5: // directory (i.e. the directory containing TestApp.exe)
   6: // The config file will be watched for changes.
   1: // Configure log4net using the .log4net file
   2: [assembly: log4net.Config.XmlConfigurator(ConfigFileExtension="log4net",Watch=true)]
   3: // This will cause log4net to look for a configuration file
   4: // called TestApp.exe.log4net in the application base
   5: // directory (i.e. the directory containing TestApp.exe)
   6: // The config file will be watched for changes.

特性在一个组件集中只能使用一次

使用特性可以清晰的指定应用程序从何处加载配置文件,但特性是完全被动的,将不会起任何作用,他们只是一些信息。因此如果你使用了配置特性必须调用log4net允让它读取特性,简单的调用LogManager.GetLogger便可以使程序集中的特性能够被读取和处理。因此程序启动后尽早调用logging方法是必要的,而且必须在任何外部的组件集在读取和调用之前。

配置文件

典型的log4net配置是通过文件,文件可以通过两种方式读取
1. 使用.NET System.Configuration API
2. 直接读取内容

.config 文件

System.Configuration API只在配置数据在应用程序的config文件中时才起作用,如MyApp.exe.config或者Web.config.因为System.Configuration API不支持载入config文件中configuration外的标记时使用log4net.Config.XmlConfigurator.ConfigureAndWatch方法,使用System.Configuration API最大的有点在于它相比直接读取需要较低的权限。

使用System.Configuration API进行配置的唯一方法是调用log4net.Config.XmlConfigurator.Configure() 方法或者 the log4net.Config.XmlConfigurator.Configure(ILoggerRepository) 方法.

为了能够把配置数据嵌入到.config文件中,节的名字必须在configSections元素中注册到.NET解释器,还必须指定log4net.Config.Log4NetConfigurationSectionHandler用来解释这一配置节。其中类型必须是完整的组件集名因为它被.NET config文件解释器读取而不是log4net。必须指定正确的log4net组件集名。下面的配置文件示范了正确的方式

   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <configuration>
   3:     <configSections>
   4:         <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
   5:     </configSections>
   6:     <log4net>
   7:         <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
   8:             <layout type="log4net.Layout.PatternLayout">
   9:                 <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
  10:             </layout>
  11:         </appender>
  12:         <root>
  13:             <level value="INFO" />
  14:             <appender-ref ref="ConsoleAppender" />
  15:         </root>
  16:     </log4net>
  17: </configuration>

上面的理智中,指定了log4net组件集,他必须位于.NET运行时能够找到的地方,例如与程序相同的文件夹。如果log4net组件集位于GAC中,完整的组件集名还包括文化、版本和公钥。

当用.config文件来配置时,节名即XML元素名必须为log4net。

直接读取内容

XmlConfigurator能够直接读取XML文件并用它来配置log4net,包括.config文件如MyApp.exe.config或者Web.config。
不使用直接读取的唯一原因是应用程序的权限不能直接读取文件。因此必须使用NET configuration APIs

包含配置数据的文件可以通过任何接受System.IO.FileInfo对象的log4net.Config.XmlConfigurator方法指定。因为文件系统能够用于监测并通知文件的变化,所以ConfigureAndWatch 方法被用于监测配置文件并在未见改变时重载它配置log4net。

此外,log4net.Config.XmlConfiguratorAttribute可以用于指定配置文件。

配置从文件中的log4net节读取,文件中只能有一个log4net元素但是它可以位于XML中的任意等级,例如根元素

   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <log4net>
   3:     <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
   4:         <layout type="log4net.Layout.PatternLayout">
   5:             <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
   6:         </layout>
   7:     </appender>
   8:     <root>
   9:         <level value="INFO" />
  10:         <appender-ref ref="ConsoleAppender" />
  11:     </root>
  12: </log4net>
或者嵌入其他元素间。
   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <configuration>
   3:     <configSections>
   4:         <section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
   5:     </configSections>
   6:     <log4net>
   7:         <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
   8:             <layout type="log4net.Layout.PatternLayout">
   9:                 <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
  10:             </layout>
  11:         </appender>
  12:         <root>
  13:             <level value="INFO" />
  14:             <appender-ref ref="ConsoleAppender" />
  15:         </root>
  16:     </log4net>
  17: </configuration>

上面的配置文件显示了怎么样把配置数据嵌入到.config文件中尽管文件能够被log4net直接读取。值得注意的是.NET config文件解释器如果发现没有在configSections元素注册的元素将会抛出一个异常。因此,上面的例子将log4net节注册,但是指定的处理类型为System.Configuration.IgnoreSectionHandler.这个内建的类表示已使用另外的方法来读取配置节。

2 COMMENTS:

Biby Cletus said...

Nice post, its a really cool blog that you have here, keep up the good work, will be back.

Warm Regards

Biby Cletus - Blog

sacranto said...

Thanks
I went to your blog. it's also amazing one