C#中Log4Net昨日日志缺失,多日前日志正常显示问题求助
你的问题核心是RollingFileAppender的滚动逻辑被动态代码修改破坏,导致每日日志文件的生成和保留出现异常,具体原因如下:
错误的类型转换
代码中将RollingFileAppender强制转换为FileAppender,虽然二者存在继承关系,但这种转换会丢失RollingFileAppender特有的滚动配置(比如datePattern、rollingStyle)。调用ActivateOptions()后,原有的滚动规则被重置,导致日志文件的命名和滚动逻辑混乱。固定文件名覆盖滚动规则
原配置中<file>指向文件夹,配合datePattern会自动生成带日期后缀的滚动文件,但你的代码将File属性设置为固定文件名(如DriverLog.txt),且未包含日期模板。这会让RollingFileAppender无法正确识别每日滚动的文件命名规则,导致前一日的日志文件未被正确保留,或被后续的日志操作覆盖。未配置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

