Как устранить неисправность log4net, когда он прекращает протоколирование

Кажется, что Log4Net молча отключается по причинам, которые не очевидны, и я не понимаю, как их устранить. Моя догадка заключается в том, что конкретный appender терпит неудачу в определенном сообщении журнала и, кажется, закрывает весь стек.

Есть ли способ заставить Log4Net выбрасывать exeception (по крайней мере, во время нашей фазы отладки), а не завершать работу службы.

Ответ 1

Я думаю, что есть значение конфигурации, которое вы можете поместить в разделе appSettings вашего app.config/web.config, чтобы включить внутренние инструкции отладки в log4net:

<appSettings>
    <add key="log4net.Internal.Debug" value="true"/>
</appSettings>

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

Ответ 2

Расширение предыдущего ответа -

Чтобы добавить прослушиватель трассировки для трассы log4net.Internal.Debug, добавьте это в конфигурацию вашего приложения:

  <system.diagnostics>
    <trace autoflush="true">
      <listeners>
        <add
            name="textWriterTraceListener"
            type="System.Diagnostics.TextWriterTraceListener"
            initializeData="c:\temp\log4net.txt" />
      </listeners>
    </trace>
  </system.diagnostics>

Замените значение атрибута initializeData выше на ваш желаемый путь к файлу журнала. Убедитесь, что у приложения или сервера ASP.NET есть разрешение на запись в этот файл.

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

Итак, если у вас есть что-то вроде этого:

XmlConfigurator.Configure();

измените его на

ICollection configMessages = XmlConfigurator.Configure();

и проверите configMessages в отладчике или распечатайте их где-нибудь, например

foreach (string msg in configMessages)
{
   Console.WriteLine(msg);
}

Если все остальное не удается, загрузите источник log4net, добавьте проект в свое решение и укажите проект вместо log4net.dll. Теперь вы можете войти в вызовы log4net в отладчике.

Ответ 3

Мне было сложно узнать, почему файлы журнала и SQL-приложения не работали. Я изменил таблицу SQL по умолчанию, и оказалось, что тип данных Int не был хорошим, а значение Int32 было правильным. Я не мог найти эту информацию до тех пор, пока не отлажу в Visual Studio и не войду в метод ведения журнала. Выполнение метода было приостановлено на моей точке останова, и я запустил команду настройки в окне Immediate:

log4net.Config.XmlConfigurator.Configure()

Я смог увидеть немедленную обратную связь, и на самом деле было исключение, возникшее при запуске этого кода конфигурации. Он отображается в окне "Немедленное", и я смог решить проблему.

Надеюсь, это поможет кому-то.