LoggingFacility - 控制将使用的记录器

时间:2012-04-17 19:38:37

标签: castle-windsor log4net

我正在使用Log4Net Castle.WindsorLoggingFacilityLog4netIntegration。我正在使用它的项目涉及NHibernate,它也与log4net进行对话。

我要做的是拆分日志,以便NHibernate在一个日志(data-log.txt)中结束,而所有系统日志记录最终都在一个单独的日志(system-log.txt)中。

我遇到的问题是,windsor注入的Logger似乎只会写入我的log4net配置中的根记录器。 NHibernate查找名为NHibernate或Nhibernate的记录器,因此我可以将这些日志转移到data-log.txt appender中,但它也会写入根记录器。

所以我现在得到的是来自Windsor和NHibernate的日志,最终都是根记录器,而来自NHibernate的日志最终会出现在nhibernate特定的记录器上。

这是我的app.config中的log4net配置部分:

<log4net xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<appender name="Console" type="log4net.Appender.ConsoleAppender">
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%5level [%thread] (%file:%line) - %message%newline"/>
  </layout>
</appender>
<appender name="AspNetTraceAppender" type="log4net.Appender.AspNetTraceAppender">
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
  </layout>
</appender>
<appender name="NHibernateLogAppender" type="log4net.Appender.RollingFileAppender">
  <file value="data-log.txt" />
  <!-- various stuff -->
</appender>
<appender name="SystemLogAppender" type="log4net.Appender.RollingFileAppender">
  <file value="system-log.txt" />
  <!-- various stuff -->
</appender>

<root>
  <level value="ALL" />
  <appender-ref ref="AspNetTraceAppender" />
  <appender-ref ref="Console" />      
</root>

<logger name="SystemLogger">
  <level value="ALL" />
  <appender-ref ref="SystemLogAppender" />
</logger>
<logger name="NHibernate">
  <level value="WARN" />
  <appender-ref ref="NHibernateLogAppender" />
</logger>    
<logger name="NHibernate.SQL">      
  <level value="DEBUG" />
  <appender-ref ref="NHibernateLogAppender"/>
</logger>   

和windsor正在通过这样的代码进行配置 container.AddFacility<LoggingFacility>(f => f.UseLog4Net().WithAppConfig());

如何告诉Windsor瞄准SystemLogger而不是root?

我知道一种方法是通过为每种想要使用日志记录的类型创建一个特定的记录器,但这似乎是一种很好的方式,当你以后忘记这一点时,你可以用脚射击自己。

2 个答案:

答案 0 :(得分:4)

只拥有所有appender的根记录器。然后在记录器名称上使用appender白名单和黑名单过滤:

<appender name="NHibernateLogAppender" type="log4net.Appender.RollingFileAppender">
  <file value="data-log.txt" />
  <!-- various stuff -->

  <filter type="log4net.Filter.LoggerMatchFilter">  
    <loggerToMatch value="NHibernate" />  
  </filter>
</appender>

<appender name="SystemLogAppender" type="log4net.Appender.RollingFileAppender">
  <file value="system-log.txt" />
  <!-- various stuff -->

  <filter type="log4net.Filter.LoggerMatchFilter">  
    <loggerToMatch value="NHibernate" />  
    <acceptOnMatch value="false" />
  </filter>
</appender>

<root>
  <level value="ALL" />
  <appender-ref ref="NHibernateLogAppender" /> 
  <appender-ref ref="SystemLogAppender" />
</root>

答案 1 :(得分:0)

另一条路线:我已经向Castle.Windsor团队提交了一个补丁,允许用户指定要使用的日志名称。

如果从github拉取并构建Windsor,LoggingFacility现在有一个配置方法ToLog(string LogName),允许您控制将使用哪个日志。