我将Log4Net与Castle.Windsor、LoggingFacility和Log4netIntegration结合使用。我正在使用的这个项目涉及到NHibernate,它也与log4net对话。
我想要做的是分割日志,这样NHibernate就会在一个日志中结束(data-log.txt),而所有的系统日志最终都在一个单独的日志(system-log.txt)中结束。
我遇到的问题是,似乎由温莎注入的Logger只会在我的log4net配置中写入根记录器。NHibernate查找名为NHibernate或Nhibernate的记录器,因此我可以将这些日志转移到数据日志--log.txtAppder中,但它也会将日志写入根记录器。
因此,我现在得到的是来自Windsor和NHibernate的日志,最后都是根日志记录器,而来自NHibernate的日志则是在nhibernate特定的记录器中完成的。
下面是我的log4net配置部分,在我的app.config中:
<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());的代码进行配置。
我如何告诉温莎瞄准SystemLogger而不是根?
我知道这样做的一种方法是为希望使用日志的每种类型创建一个特定的记录器,但这似乎是一种很好的方法,当您稍后忘记了这一点时,就会对自己开枪。
发布于 2012-04-17 21:30:05
只有根记录器与所有附加程序。然后对记录器名称使用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-18 17:10:14
另一条路线:我向Castle.Windsor团队提交了一个补丁,允许用户指定要使用的日志名称。
如果您从github中提取并构建了温莎,那么LoggingFacility现在有了一个配置方法ToLog(string LogName),它允许您控制将使用哪个日志。
https://stackoverflow.com/questions/10197967
复制相似问题