2010-04-23 36 views
0

我需要顯示特定記錄器被觸發時的前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> 

的想法是,緩衝附加器將存儲的所有事件,但隨後的NHibernateSqlAppender只會刷新當NHibernate.SQL事件觸發,將刷新緩衝區(10名以前的項目,在指定範圍內記錄器級別,在這個例子中是Laan。*)。

回答

1

我會實現ITriggeringEventEvaluator,當某個記錄器(理想情況下可配置)觸發時,將在IsTriggeringEvent()方法中返回true。看看一個LevelEvaluator類的實現,應該很容易。代碼將如下所示:

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

    return (loggingEvent.LoggerName == triggeringLoggerName); 
} 

使用這個新的評估程序,您的配置應該可以工作,但您應該刪除過濾程序(我猜)。