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

如何修改代码使持续运行的Windows服务中log4net每日生成新日志

解决log4net连续运行多日不生成当日新日志文件的问题

问题根源分析

从你的配置和代码来看,主要有两个核心问题导致日志没有按日期滚动:

  1. 配置文件冲突:你重复设置了<staticLogFileName>(先设false又设true),这会让log4net的滚动逻辑混乱——staticLogFileName="true"会强制使用固定文件名,直接阻止了按日期生成新文件的功能。
  2. 日期格式不匹配:<file>节点的日期格式是yyyy-MM-dd,但DatePattern用的是dd.MM.yyyy'.log',两者不兼容,导致日期滚动触发逻辑失效。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:33:28