我需要在触发特定记录器时显示前10个事件。目标是在发布NHibernate.SQL日志记录之前立即显示之前发生的步骤。
目前,我正在将NHibernate sql记录到一个单独的文件中 - 这是正常的。
<appender name="NHibernateSqlAppender" type="log4net.Appender.RollingFileAppender">
<file value="Logs\NHibernate.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10000KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{dd/MM/yy HH:mm:ss,fff} [%t] %-5p %c - %m%n" />
</layout>
</appender>
<logger name="NHibernate.SQL" additivity="false">
<level value="ALL"/>
<appender-ref ref="NHibernateSqlAppender"/>
</logger>
<logger name="NHibernate" additivity="false">
<level value="WARN"/>
<appender-ref ref="NHibernateSqlAppender"/>
</logger>
但这只输出SQL,没有上下文。我想在指定的命名空间中所有以前的日志也被记录,但是当触发HNibernate.SQL appender时仅。
我已经调查过使用BufferingForwardingAppender作为收集所有事件的方法,然后在NHibernateSqlAppender中过滤它们,但这不起作用。我已经阅读过关于LoggerMatchFilter类的内容,看起来它会有所帮助,但我不知道该把它放在哪里。
<appender name="BufferingForwardingAppender" type="log4net.Appender.BufferingForwardingAppender" >
<bufferSize value="10" />
<lossy value="true" />
<evaluator type="log4net.Core.LevelEvaluator">
<threshold value="ALL"/>
</evaluator>
<appender-ref ref="NHibernateSqlAppender" />
</appender>
<appender name="NHibernateSqlAppender" type="log4net.Appender.RollingFileAppender">
<file value="Logs\NHibernate.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10000KB" />
<staticLogFileName value="true" />
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="NHibernate.SQL" />
<loggerToMatch value="Laan" />
</filter>
<filter type="log4net.Filter.LoggerMatchFilter">
<loggerToMatch value="NHibernate" />
<acceptOnMatch value="false"/>
</filter>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%d{dd/MM/yy HH:mm:ss,fff} [%t] %-5p %c - %m%n" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="BufferingForwardingAppender"/>
</root>
这个想法是缓冲appender将存储所有事件,但是NHibernateSqlAppender只会在NHibernate.SQL事件触发时刷新, plus 它将刷新缓冲区(前面的10个项目,指定的记录器级别,在此示例中为Laan。*)。
答案 0 :(得分:1)
我会实现ITriggeringEventEvaluator
,当某个记录器(理想情况下可配置)触发时,IsTriggeringEvent()
方法会在LevelEvaluator
方法中返回true。看看public bool IsTriggeringEvent(LoggingEvent loggingEvent)
{
if (loggingEvent == null)
{
throw new ArgumentNullException("loggingEvent");
}
return (loggingEvent.LoggerName == triggeringLoggerName);
}
类的实现,应该很容易。代码如下所示:
{{1}}
使用这个新的评估程序,你的配置应该可以工作,但你应该删除过滤器(我猜)。