log4net +多线程+滚动文件appender

时间:2012-04-18 22:22:57

标签: multithreading log4net rollingfileappender

我在log4net.config中有log4net的这个设置,允许多个线程写入同一个文件:

<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问题?

2 个答案:

答案 0 :(得分:10)

通过删除锁定模型密钥解决了这个问题,因为我只有一个使用相同记录器的进程(IIS,w3wp.exe)。

<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>

因为有人说here

  

如果使用RollingFileAppender,事情会变得更糟,因为多个进程可能会尝试同时开始滚动日志文件。 RollingFileAppender在滚动文件时完全忽略锁定模型,滚动文件与此方案完全不兼容。

我认为你会得到不可预测的结果。

答案 1 :(得分:0)

我的猜测是你在datePattern上使用 - 符号会使框架混乱,因此在第一次滚动后任何日志都会触发滚动事件。

使用

尝试此操作时会发生什么
<datePattern value="yyyyMMdd" />

根据示例here

  

要更改滚动周期,请调整DatePattern值。 :用于   例如,日期模式“yyyyMMdd”将每天滚动。请参阅   System.Globalization.DateTimeFormatInfo获取可用列表   图案。