2009-08-06 3 views
3

Log4net слишком хорош в том, чтобы не бросать ошибки. Я пытаюсь создать какой-то обработчик, который срабатывает, если log4net не может запускаться или умирает и больше не может регистрироваться.Как получать события, если log4net останавливает ведение журнала

Я знаю ключ настроек приложения, чтобы включить внутреннюю отладку log4net (log4net.Internal.Debug). Мне не нужна вся информация отладки все время, хотя, если есть проблема с log4net.

У кого-нибудь есть способ, которым они программно захватили и обработали ошибки в log4net?

ответ

0

Ну, log4net будет очень тяжело для вас сделать это, так как он (по дизайну) подавляет исключения, которые бросаются во время операций регистрации. Это связано с тем, что производственная система не должна прерываться из-за ошибки при форматировании сообщения журнала.

Стоит попробовать с очень простыми макетами шаблонов, поскольку иногда это использование элементов% P {XYZ} в шаблонах шаблонов, которые вызывают проблемы, если соответствующие свойства не установлены должным образом. Если все работает так, как ожидалось, с помощью простого шаблона шаблона, вы можете добавить то, что вам нужно, по одному за раз и посмотреть, можете ли вы точно определить проблему.

+2

Это кажется правильным. В течение нескольких раз, когда мы нуждались в этом, мы включали log4net.Internal.Debug. –

4

Что-то, что может сработать для вас, это создать класс, который реализует IErrorHandler для каждого приложения, а затем настроить каждого пользователя для использования класса обработки ошибок. Это должно дать вам больше контроля, чем включение log4net.Internal.Debug.

Я только что дал этому попытку, и она работает (обратите внимание, что в моем примере Logger является log4net регистратор определяется в другом месте - цель за это, чтобы захватить ошибки от SMTP Appender и зарегистрировать их в файл):

using System; 

using log4net.Core; 

namespace Test 
{ 
    public class SmtpErrorHandler : IErrorHandler 
    { 
     public void Error(string message) 
     { 
      Logger.Log.Error(message); 
     } 

     public void Error(string message, Exception ex) 
     { 
      Logger.Log.Error(message, ex); 
     } 

     public void Error(string message, Exception ex, ErrorCode errorCode) 
     { 
      Logger.Log.Error(String.Format("{0}{1}Error code: {2}", message, Environment.NewLine, errorCode), ex); 
     } 
    } 
} 

Где я могу настроить Appender (конечно, вы можете сделать это в конфиге тоже):

emailAppender.ErrorHandler = new SmtpErrorHandler(); 
0

Мы создали наш собственный класс, который выполняет Logger.Log.Error ... и если исключение бросается или что-то пошло не так, мы пишем исходную ошибку и al поэтому исключение в журнал событий Windows.

При анализе ошибок пользователь должен отправить нам не только файлы журналов, но и журнал событий. Мы создали инструмент, который автоматически экспортирует журналы событий и сжимает их вместе со всеми доступными лог-файлами Log4net в zip-файл.

0

Если вы используете инструмент мониторинга, такой как SCOM (System Center Operations Manager), вы можете настроить его для мониторинга файлов журнала и предупредить вас, если никаких изменений не было сделано более чем на n часов/дней.