首页 > 解决方案 > log4net RollingFileAppender 在重新启动应用程序后意外覆盖翻转文件

问题描述

我们有一个具有以下 log4net 配置的应用程序(v 2.0.12):

<appender name="LogFileAppenderXML" type="log4net.Appender.RollingFileAppender">
    <file value="D:\Logs\" />
    <datePattern value="yyyy-MM-dd'_AppName.xml'" />
    <preserveLogFileNameExtension value="true" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <rollingStyle value="Composite" />
    <maxSizeRollBackups value="30" />
    <maximumFileSize value="500KB" /> <-- in production this value is much larger; 500KB produces rolled-over files faster when reproducing this behavior
    <staticLogFileName value="false" />
    <layout type="log4net.Layout.XmlLayout"/>
</appender>

这意味着我们希望按日期(天)和按大小(即rollingStyle=Composite)滚动。我们还希望将被主动记录的日志文件的文件名保持为固定(staticLogFileName),以便我们可以使用查看器(Log4View)保持文件打开。在应用程序的一次运行中,一切都按预期工作。但是如果我重新启动应用程序,已经翻转的文件将被覆盖。

假设以下文件已经在目标目录中:

- 2021-07-22_AppName.xml
- 2021-07-22_AppName.1.xml
- 2021-07-22_AppName.2.xml
- 2021-07-22_AppName.3.xml

如果我启动应用程序,新的日志条目将正确附加到主文件2021-07-22_AppName.xml。但是,一旦maximumFileSize达到 in 大小,数据将写入 2021-07-22_AppName.1.xml,从而覆盖其中包含的现有数据。

我的期望是框架识别这个初始状态,并且 1)附加到主文件,以及 2)选择一个继续翻转序列的文件名(在这种情况下为 4)。

我尝试了什么?

基于这个答案,我尝试了以下

    <file type="log4net.Util.PatternString" value="D:\\Logs\\.xml" />
    <datePattern value="yyyy-MM-dd'_AppName'" />

也试过一个conversionPatternlike

    <file type="log4net.Util.PatternString">
        <conversionPattern value="D:\Logs\%date{yyyy-MM-dd}_AppName.xml" />
    </file>

但它会在开头和结尾创建带有日期的文件(即2021-07-22_AppName2021-07-22.xml

我已经看过这个问题(我没有多个进程/实例记录到文件中)。

问题

  1. 我正在尝试做的甚至支持/可能吗?如果是这样,我错过了什么?
  2. 有没有办法将日期file.value添加到文件名的末尾,或者总是在扩展名之前添加到文件名的末尾?

标签: log4netlog4net-configuration

解决方案


推荐阅读