2015-09-10 2 views
0

Есть ли способ предотвратить log4net для регистрации одного и того же исключения n-times? Я хочу добиться того, что если последнее исключение совпадает с фактическим исключением, я не хочу регистрироваться.Как предотвратить повторное исключение в log4net?

+1

Как выглядит ваш код регистрации на данный момент? [MVC] (http://stackoverflow.com/help/mcve) всегда замечательный. – Tobbe

+0

Где код? log4net делает * не * записывает одно и то же исключение n раз - это код обработки исключений *, который делает это. Если вы не хотите регистрировать каждый метод, просто не делайте этого. Зарегистрируйтесь в наивысшей точке иерархии вызовов, например, в действии контроллера MVC или обработчике команд в приложении WPF. Или измените уровень серьезности различных вызовов журналов и примените фильтры с наивысшей серьезностью вверху, ниже (подробный, отлаживаемый) на более низких уровнях. –

+1

Посмотрите на [этот вопрос] (http://stackoverflow.com/questions/ 1208541/log4net-any-filter-for-logging-only-the-nth-message/4308493 # 4308493) – stuartd

ответ

1

Буферизирующий appender с параметром lossy, установленным в true, выполнит трюк, если вы готовы написать собственный класс для подключения к нему. Вот код для добавляющим происходящего в BufferingAppenderSkeleton

if (this.m_cb == null || this.m_bufferSize <= 1) 
{ 
    if (!this.m_lossy || (this.m_evaluator != null && this.m_evaluator.IsTriggeringEvent(loggingEvent)) || (this.m_lossyEvaluator != null && this.m_lossyEvaluator.IsTriggeringEvent(loggingEvent))) 
    { 
     if (this.m_eventMustBeFixed) 
     { 
      loggingEvent.Fix = this.Fix; 
     } 
     this.SendBuffer(new LoggingEvent[] 
     { 
      loggingEvent 
     }); 
    } 
} 

Как вы можете видеть, если вы установите размер буфера через 1, сжимал в истинен и оценщик, вы можете решить, чтобы в проходе событий если this.m_lossyEvaluator.IsTriggeringEvent(loggingEvent) возвращает true.

Таким образом, вы можете создать пользовательский ITriggeringEventEvaluator и позволить ему хранить последнее исключение, которое прошло, а затем для каждого последующего исключения сравнивайте оба значения. Если они являются одинаковыми, возвращает false, если не возвращать true и изменять последнее значение исключения. Затем создайте BufferingForwardingAppender и настройте его с помощью вашего оценщика.

+0

Этот ответ носит чисто технический характер, но комментарии к вашему вопросу должны быть учтены. – samy

Смежные вопросы