如何修改代码使持续运行的Windows服务中log4net每日生成新日志
解决log4net连续运行多日不生成当日新日志文件的问题
问题根源分析
从你的配置和代码来看,主要有两个核心问题导致日志没有按日期滚动:
- 配置文件冲突:你重复设置了
<staticLogFileName>(先设false又设true),这会让log4net的滚动逻辑混乱——staticLogFileName="true"会强制使用固定文件名,直接阻止了按日期生成新文件的功能。 - 日期格式不匹配:
<file>节点的日期格式是yyyy-MM-dd,但DatePattern用的是dd.MM.yyyy'.log',两者不兼容,导致日期滚动触发逻辑失效。 - Logger初始化不规范:虽然不是直接原因,但
GetLogger(typeof(System.Reflection.MethodBase))会生成一个奇怪的logger名称,建议修正为对应类型。
分步解决方案
1. 修正log4net配置文件
替换你的<log4net>节点内容为以下配置,我已经修复了冲突项并统一了日期格式:
<log4net> <appender name="file" type="log4net.Appender.RollingFileAppender"> <!-- 使用UTC日期生成日志文件名前缀 --> <file type="log4net.Util.PatternString" value="Logs\log-" /> <!-- 关闭静态文件名,允许动态生成带日期的文件 --> <staticLogFileName value="false" /> <!-- 追加到现有文件,而非覆盖 --> <appendToFile value="true" /> <!-- 滚动策略:同时按日期和文件大小滚动 --> <rollingStyle value="Composite" /> <!-- 最多保留5个备份文件 --> <maxSizeRollBackups value="5" /> <!-- 单个文件最大5MB --> <maximumFileSize value="5MB" /> <!-- 日期格式,与文件名前缀匹配,生成完整文件名如log-2024-05-20.txt --> <datePattern value="yyyy-MM-dd'.txt'" /> <!-- 日志内容格式 --> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date [%thread] %level %logger - %message%newline" /> </layout> </appender> <root> <level value="ALL" /> <appender-ref ref="file" /> </root> </log4net>
关键调整说明:
- 移除了重复的
<staticLogFileName value="true" />,确保staticLogFileName为false,允许动态生成带日期的文件名。- 将
<file>简化为前缀Logs\log-,通过datePattern拼接日期后缀,让log4net自动在日期变更时生成新文件。- 统一日期格式为
yyyy-MM-dd,确保文件名和滚动逻辑一致。
2. 修正Logger类的初始化逻辑
你的Logger类有两个小问题需要调整:
- 初始化Logger时应该传入当前类的类型,这样日志里的
%logger字段会显示正确的名称。 - 确保log4net在应用启动时加载配置,避免初始化失败。
修正后的Logger类代码:
public static class Logger { public static log4net.ILog Log { get; private set; } static Logger() { // 确保log4net加载配置文件 log4net.Config.XmlConfigurator.Configure(); // 使用当前Logger类的类型初始化日志实例 Log = log4net.LogManager.GetLogger(typeof(Logger)); } public static void Trace(string message) { Log.Info(message); } public static void LogException(Exception ex) { var builder = new StringBuilder(); builder.AppendLine("=============Exception==========="); builder.AppendLine("Exception: {0}"); builder.AppendLine("StackTrack: {1}"); Log.ErrorFormat(builder.ToString(), ex.Message, ex.StackTrace); } }
补充说明:如果是Windows服务,也可以在服务的
OnStart方法中调用log4net.Config.XmlConfigurator.Configure(),确保配置在服务启动时正确加载。
3. 可选:开启配置监听(推荐)
如果希望log4net在配置文件修改后自动生效,可以在项目的AssemblyInfo.cs中添加以下代码:
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
这样log4net会实时监听配置文件的变化,无需重启服务即可应用新配置。
验证方法
启动服务后,等待UTC日期变更(或临时修改系统时间测试),检查Logs目录下是否生成了新的log-YYYY-MM-DD.txt文件,且日志内容写入到了新文件中。
内容的提问来源于stack exchange,提问作者Aamir
相关产品推荐
相关产品推荐

