2010-02-14 3 views
30

В настоящее время я создаю приложение ASP.Net-MVC, используя log4net для ведения журнала, но, похоже, регистратор просто останавливается наугад. Он будет долго ждать в течение некоторого времени, а затем остановится, а затем начнется снова через некоторое время. Я даже не уверен, что это значит, что он возобновляет ведение журнала. Я не говорю о том, что потеряно несколько сообщений - иногда оно исчезает в течение длительного периода времени, например, часа или около того.Log4net случайно останавливает ведение журнала.

Зачем это останавливаться и начинаться вот так? Как я должен правильно настроить это, чтобы он не случайно останавливался, как он?

Вот моя конфигурация:

<log4net debug="true"> 
<appender name="RollingLogFileAppender" 
     type="log4net.Appender.RollingFileAppender"> 

    <file value="..\Logs\\CurrentLog.txt" /> 
    <appendToFile value="true" /> 
    <datePattern value="yyyyMMdd" /> 

    <rollingStyle value="Date" /> 
    <filter type="log4net.Filter.LevelRangeFilter"> 
    <acceptOnMatch value="true" /> 

    <levelMin value="INFO" /> 
    <levelMax value="FATAL" /> 
    </filter> 

    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern 
    value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" /> 
    </layout> 

</appender> 

<root> 
    <level value="INFO" /> 
    <appender-ref ref="RollingLogFileAppender" /> 
</root> 

+1

В моем случае это был перезапуске протоколирование (повторно его настройки, а не дизайн ..), что вызвало эти рода проблемы - см http://neilkilbride.blogspot.com.au /2008/04/configure-log4net-only-once.html – Jonno

+0

Не могли бы вы добавить ответ или комментарий, объяснив, что вызвало вашу проблему, если вы нашли причину? –

+0

Да, было бы неплохо узнать, что вызвало вашу проблему, как сказал Марк. Кстати, у меня была такая же проблема, и настройка ReconnectOnError на true в конфигурации ADONetAppender работала для меня. – Jportelas

ответ

56

Log4Net будет fail silently если что-то пойдет не так, и это не может записать его appenders. Это на самом деле хорошо, потому что это означает, что бит неудачного ведения журнала не приведет к разрушению здоровой системы, но может раздражать, когда что-то не регистрируется, как вы ожидаете.

Ваш лучший выбор - включить собственный log4net internal logging, чтобы выполнить некоторые диагностические операции и (надеюсь) разработать, почему он не работает.

Таким образом, в конфигурационном файле дополнения вашего приложения:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <appSettings> 
     <add key="log4net.Internal.Debug" value="true"/> 
    </appSettings> 
</configuration> 

, который включается внутренней вырубкой, который отправляется в System.Diagnostics.Trace, так что вы можете добавить:

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

, чтобы захватить это к файл.

+1

У вас есть более полный пример такого файла конфигурации? Я пробовал множество вариантов, и я продолжаю получать XML-ошибки из XmlSerializationReader. Даже просто пустой тег '' - разница между исключением и не. –

+0

У меня такая же проблема, и в моем случае это выглядит так: в любое время, когда я открываю стандартный диалог с файлом, накладка DLL с надписью [Box] (https://box.com) перезаписывает встроенный log4net.config с его собственным. –

+0

Это на самом деле не очень хорошо, поскольку в зависимости от этого могут быть средства мониторинга системы и уведомления об ошибках, и если он прекратит ведение журнала, мы не сможем узнать об исключении.Ненавижу этот дерьмовый инструмент каротажа, это всегда головная боль, какая бы ни была в моей компании, независимо от используемой версии, всегда есть головная боль. Crappy разработчиков дерьмовый продукт .. – sotn

0

Отправляйте сообщение тестового журнала как можно скорее в жизненном цикле вашего приложения, просто сделайте просто LogManager.GetLogger("Init").Info("Starting logging"). Если какой-либо другой ссылочный код первым начинает регистрировать, часть процесса инициализации может выйти из строя (поскольку он загружает настройки из другой сборки, что она делает только один раз).

Читайте здесь: https://logging.apache.org/log4net/release/faq.html#first-log

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