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>
4 ответа
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>
чтобы захватить это в файл.
Отправьте тестовое сообщение журнала как можно раньше в жизненном цикле приложения, просто LogManager.GetLogger("Init").Info("Starting logging")
Сделаю. Если какой-либо другой ссылочный код первым начинает запись в журнал, может произойти сбой части процесса инициализации (так как он загружает настройки из другой сборки, что он делает только один раз).
Читайте здесь: https://logging.apache.org/log4net/release/faq.html
Также проверьте, настроен ли log4net в файле AssemblyInfo.cs. В моем случае при регистрации в этом файле была удалена следующая строка:
[сборка: log4net.Config.XmlConfigurator(Watch = true)]
Что, в свою очередь, привело к тому, что log4net прекратил запись
Поработав некоторое время с Log4Net, я обнаружил, что он вообще перестанет регистрироваться. Неважно, что я пытался, я не мог вернуть его на работу. Кажется, что есть проблемы, когда вы не инициализируете журнал в первых нескольких строках кода, но этого нечеткого указания мне было недостаточно, чтобы надежно заставить журнал работать в dll, загруженном другой программой, и так далее.
Мне так и не удалось активировать внутренний журнал.
Я наконец решил создать специальную библиотеку DLL, которую мои программы могут вызывать для надежного создания журнала с использованием Log4Net. DLL делает только это, и код, создающий журнал, изолирован и никогда не изменяется. Я предполагаю, что таким образом я смогу надежно создавать файлы журналов и записывать в них. До сих пор этот подход исправлял проблемы со входом в систему, на которые я тратил бесчисленные разочаровывающие часы.
Я разместил код в этой теме: