Log4net случайно останавливает ведение журнала.
В настоящее время я создаю приложение ASP.Net-MVC с использованием 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
Log4Net будет терпеть неудачу, если что-то пойдет не так, и он не может записать свои приложения. Это на самом деле хорошо, поскольку это означает, что бит неудачного ведения журнала не приведет к снижению здоровой системы, но это может раздражать, когда что-то не регистрируется, как вы ожидаете.
Лучше всего включить собственный log4net внутреннее ведение журнала, чтобы выполнить некоторую диагностику и (надеюсь) выяснить, почему это не удается.
Итак, в вашем конфигурационном файле приложения добавьте:
<?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>
чтобы зафиксировать это в файле.
Ответ 2
Отправьте сообщение тестового журнала как можно раньше в жизненном цикле приложения, просто выполните LogManager.GetLogger("Init").Info("Starting logging")
. Если какой-либо другой ссылочный код первым начинает регистрировать, часть процесса инициализации может завершиться неудачно (поскольку он загружает настройки из другой сборки, что она делает только один раз).
Читайте здесь: https://logging.apache.org/log4net/release/faq.html#first-log