Вопрос по c#, log4net – Как получать события, если log4net перестает регистрировать

3

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

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

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

Ваш Ответ

4   ответа
0

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

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

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

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

0

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

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

4

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

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

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();

Похожие вопросы