Log4net + несколько потоков + скопированный файл appender
У меня есть эти параметры для log4net в log4net.config, чтобы разрешить нескольким потокам писать в один файл:
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
<!-- Minimal locking to allow multiple threads to write to the same file -->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<file value="log\UI.log"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<maxSizeRollBackups value="30"/>
<datePattern value="-yyyyMMdd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline%date [%thread] %-5level [%property{identity}] %logger{3} - %message%newline"/>
</layout>
</appender>
Но после полуночи новый файл журнала все время перезаписывается, и, таким образом, в файле есть только последнее событие. После перезагрузки сервера все снова будет продолжаться до следующей полуночи.
Так может ли кто-нибудь сказать, является ли это проблемой конфигурации, или это просто проблема с log4net?
Ответы
Ответ 1
Проблема была решена путем удаления ключа блокировки, так как у меня есть только один процесс (IIS, w3wp.exe), который использует тот же журнал.
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
Так как было сказано здесь:
Если вы используете RollingFileAppender, все становится еще хуже, поскольку несколько процессов могут попытаться одновременно запустить файл журнала. RollingFileAppender полностью игнорирует блокирующую модель при перетаскивании файлов, скользящие файлы просто несовместимы с этим сценарием.
Я думаю, что вы получите непредсказуемые результаты.
Ответ 2
Мое предположение заключается в том, что использование знака на datePattern
сбивает фреймворк так, что после первого рулона любой журнал запускает событие roll.
Что произойдет, если вы попробуете это с помощью
<datePattern value="yyyyMMdd" />
на пример здесь.
Чтобы изменить период проката, измените значение DatePattern. Для Например, шаблон даты "yyyyMMdd" будет катиться каждый день. См. System.Globalization.DateTimeFormatInfo для списка доступных узоры.