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 для списка доступных узоры.