Log4Net带有复合滚动样式的RollingFileAppender正在覆盖数据。

13

我有一个Log4Net RollingFileAppender,其配置如下:

<configuration>

  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <log4net>

    <root>
      <level value="ALL" />
    </root>

    <logger name="RollingFileAppender" additivity="false">
      <level value="DEBUG"/>
      <appender-ref ref="RollingFileAppender" />
    </logger>

    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" >
      <param name="File" value="C:\\MyLog.log" />
      <param name="AppendToFile" value="true" />
      <param name="DatePattern" value="yyyy-MM-dd"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%m%n"/>
      </layout>
    </appender>

  </log4net>

</configuration>
根据文档默认的滚动方式是Composite,因此当日志文件达到某个大小(默认为10MB)时,它会滚动而不仅仅是按日期滚动。

问题在于,当它达到大小限制时,它会重新开始记录日志并且我会丢失一天中前半部分的数据(这通常发生在中午左右达到大小限制)。
为什么它不会直接滚动到一个新文件中,所有未来的日志行都放入MyLog.log中呢? 或者说日志正在滚动,但是在午夜时分又重新滚动并覆盖日期标记的日志文件(例如,在达到10MB后滚动到MyLog.log2009-04-08,然后在午夜时分再次覆盖同一文件)?

我将设置

<rollingStyle value="Date" />

这是我必须做的所有事情来确保它仅在日期边界上滚动吗?我能否在Log4Net.config中即时更改此设置,还是必须重新启动应用程序?它正在IIS6上运行。


只是确认我是否理解:您想按日期大小滚动吗?还是只有日期? - Mauricio Scheffer
我希望它只按日期滚动。但默认情况下,滚动设置为复合方式,因此会在日期或大小中先到达的那个条件下滚动。 - Tai Squared
2个回答

15

这是我的设置。它只基于日期滚动:

<log4net>
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
        <file value="c:\Logs\Today.log"/>
        <rollingStyle value="Date"/>
        <datePattern value="yyyyMMdd"/>
        <appendToFile value="true"/>
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%level %logger %date{ISO8601} - %message%newline"/>
        </layout>
    </appender>
    <root>
        <!-- Options are "ALL", "DEBUG", "INFO", "WARN", "ERROR", "FATAL" and "OFF". -->
        <level value="ERROR"/>
        <appender-ref ref="RollingFile"/>
    </root>
</log4net>

如果您更改了web.config文件,会自动重新启动应用程序(因此您将失去会话等信息)。


11

尝试在你的RollingFileAppender中添加maxSizeRollBackups参数,以解决我们问题的一半。 这样,当日志文件滚动时,它不会覆盖旧日志,而是滚动到另一个文件。

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" >
  <param name="File" value="C:\\MyLog.log" />
  <param name="AppendToFile" value="true" />
  <param name="DatePattern" value="yyyy-MM-dd"/>
  <param name="maxSizeRollBackups" value="10" />
  <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%m%n"/>
  </layout>
</appender>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接