0

我正在使用Log4Netwith Castle.Windsor、 theLoggingFacilityLog4netIntegration。我在其中使用的项目涉及NHibernate,它也与log4net.

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

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

所以我现在得到的是来自 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>   

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

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

我知道做到这一点的一种方法是为每种想要使用日志记录的类型创建一个特定的记录器,但是当您稍后忘记这一点时,这似乎是一个很好的方法。

4

2 回答 2

4

只有带有所有附加程序的根记录器。然后对记录器名称使用 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>
于 2012-04-17T21:30:05.577 回答
0

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

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

于 2012-04-18T17:10:14.353 回答