Как я могу получить предыдущие зарегистрированные события, когда определенный регистратор запущен? - PullRequest
0 голосов
/ 23 апреля 2010

Мне нужно показать предыдущие 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. *).

1 Ответ

1 голос
/ 23 апреля 2010

Я бы реализовал ITriggeringEventEvaluator, который возвращает true в методе IsTriggeringEvent(), когда срабатывает определенный регистратор (идеально настраиваемый).Взгляните на реализацию класса LevelEvaluator, это должно быть довольно просто.Код будет выглядеть так:

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

    return (loggingEvent.LoggerName == triggeringLoggerName); 
}

С этим новым оценщиком ваша конфигурация должна работать, хотя вы должны удалить фильтры (я полагаю).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...