How can I get the previous logged events when a particular logger is triggered?

Posted by Ben Laan on Stack Overflow See other posts from Stack Overflow or by Ben Laan
Published on 2010-04-23T04:02:22Z Indexed on 2010/04/23 6:23 UTC
Read the original article Hit count: 262

Filed under:
|

I need to show the previous 10 events when a particular logger is triggered. The goal is to show what previous steps occurred immediately before NHibernate.SQL logging was issued.

Currently, I am logging NHibernate sql to a separate file - this is working correctly.

<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>

But this only outputs SQL, without context. I would like all previous logs within a specified namespace to also be logged, but only when the HNibernate.SQL appender is triggered.

I have investigated the use of BufferingForwardingAppender as a means to collect all events, and then filter them within the NHibernateSqlAppender, but this is not working. I have read about the LoggerMatchFilter class, which seems like it is going to help, but I'm not sure where to put it.

<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>

The idea is that buffering appender will store all events, but then the NHibernateSqlAppender will only flush when an NHibernate.SQL event fires, plus it will flush the buffer (of 10 previous items, within the specified logger level, which in this example is Laan.*).

© Stack Overflow or respective owner

Related posts about log4net

Related posts about nhibernate