Мне нужно показать предыдущие 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, plus сбрасывает буфер (из 10 предыдущих элементов в пределах указанного Уровень логгера, который в этом примере - Laan. *).