You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中Log4Net昨日日志缺失,多日前日志正常显示问题求助

问题分析

你的问题核心是RollingFileAppender的滚动逻辑被动态代码修改破坏,导致每日日志文件的生成和保留出现异常,具体原因如下:

  1. 错误的类型转换
    代码中将RollingFileAppender强制转换为FileAppender,虽然二者存在继承关系,但这种转换会丢失RollingFileAppender特有的滚动配置(比如datePattern、rollingStyle)。调用ActivateOptions()后,原有的滚动规则被重置,导致日志文件的命名和滚动逻辑混乱。

  2. 固定文件名覆盖滚动规则
    原配置中<file>指向文件夹,配合datePattern会自动生成带日期后缀的滚动文件,但你的代码将File属性设置为固定文件名(如DriverLog.txt),且未包含日期模板。这会让RollingFileAppender无法正确识别每日滚动的文件命名规则,导致前一日的日志文件未被正确保留,或被后续的日志操作覆盖。

  3. 未配置staticLogFileName
    默认情况下staticLogFileName为true,意味着当前日志文件使用固定名称,滚动后的文件才会添加日期后缀。但你的配置中未明确设置该属性,结合动态修改文件名的操作,进一步加剧了文件命名的混乱。

解决方案

1. 修正动态配置代码的类型转换

将代码中的FileAppender改为RollingFileAppender,保留滚动相关的配置:

String logFolder = ConfigurationManager.AppSettings.Get("LogFolder");
String appName = ConfigurationManager.AppSettings.Get("AppName");
var appenders = LogManager.GetRepository().GetAppenders();
foreach (var appender in appenders)
{
    // 正确转换为RollingFileAppender
    var rollingAppender = appender as log4net.Appender.RollingFileAppender;
    if (rollingAppender != null)
    {
        String fileName = rollingAppender.Name;
        // 配置文件名模板,让log4net自动添加日期后缀
        rollingAppender.File = $@"{logFolder}{env}\{appName}\{fileName}";
        // 关闭静态文件名,让当前日志文件不带日期,滚动后添加日期
        rollingAppender.StaticLogFileName = false;
        rollingAppender.ActivateOptions();
    }
}

2. 完善log4net配置

在RollingFileAppender中明确添加staticLogFileName配置,确保滚动逻辑正常:

<appender name="DriverLog" type="log4net.Appender.RollingFileAppender">
  <file value="D:\Logs\" />
  <appendToFile value="true" />
  <maxSizeRollBackups value="45" />
  <rollingStyle value="Date" />
  <datePattern value="yyyyMMdd" />
  <!-- 新增:关闭静态文件名,当前日志为DriverLog.txt,滚动后变为DriverLog.20240207.txt -->
  <staticLogFileName value="false" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date %-5level %logger - %message%newline" />
  </layout>
</appender>

3. 避免重复初始化

确保动态配置代码只在应用启动时执行一次,重复调用ActivateOptions()会不断重置日志文件的状态,干扰滚动逻辑。

验证逻辑

修改后,日志文件的生成规则应为:

  • 当日日志:DriverLog.txt
  • 滚动后的历史日志:DriverLog.20240207.txt、DriverLog.20240206.txt等
    这样就能保证每日日志文件被正确保留,不会出现缺失的情况。

内容的提问来源于stack exchange,提问作者Jacob R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 03:46:08