当触发特定记录器时,如何获取先前记录的事件?

时间:2010-04-23 04:02:22

标签: nhibernate log4net

我需要在触发特定记录器时显示前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。*)。

1 个答案:

答案 0 :(得分:1)

我会实现ITriggeringEventEvaluator,当某个记录器(理想情况下可配置)触发时,IsTriggeringEvent()方法会在LevelEvaluator方法中返回true。看看public bool IsTriggeringEvent(LoggingEvent loggingEvent) { if (loggingEvent == null) { throw new ArgumentNullException("loggingEvent"); } return (loggingEvent.LoggerName == triggeringLoggerName); } 类的实现,应该很容易。代码如下所示:

{{1}}

使用这个新的评估程序,你的配置应该可以工作,但你应该删除过滤器(我猜)。