【问题标题】:How can I get the previous logged events when a particular logger is triggered?触发特定记录器时,如何获取以前记录的事件?
【发布时间】:2010-04-23 14:21:23
【问题描述】:

当触发特定记录器时,我需要显示前 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 附加程序时。

我已经调查了使用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>

这个想法是缓冲附加程序将存储所有事件,但是 NHibernateSqlAppender 只会在 NHibernate.SQL 事件触发时刷新,加上它将刷新缓冲区(之前的 10 个项目,在指定的记录器级别,在本例中为 Laan.*)。

【问题讨论】:

    标签: nhibernate log4net


    【解决方案1】:

    当某个记录器(理想情况下可配置)触发时,我将实现ITriggeringEventEvaluator,它在IsTriggeringEvent() 方法中返回true。看看LevelEvaluator 类的实现,应该很简单。代码如下所示:

    public bool IsTriggeringEvent(LoggingEvent loggingEvent) 
    {
        if (loggingEvent == null)
        {
            throw new ArgumentNullException("loggingEvent");
    }
    
        return (loggingEvent.LoggerName == triggeringLoggerName); 
    }
    

    有了这个新的评估器,你的配置应该可以工作,尽管你应该删除过滤器(我猜)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多