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

3

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

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

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

Ваш Ответ

4   ответа
0

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

0

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

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

0

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

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

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

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

Я только что попробовал, и это работает (обратите внимание, что в моем примере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();

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