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

如何在C#程序的每条log4net日志中追加程序启动时间?

优化C# log4net日志自动添加程序启动时间的方案

你当前手动拼接启动时间的方式虽然能实现需求,但确实有点繁琐——每次写日志都要重复加startTime,不仅代码冗余,还容易漏掉。咱们可以利用log4net的全局上下文属性来实现自动注入,一劳永逸。

步骤1:在程序启动时设置全局日志属性

只需要在程序启动时把启动时间存入log4net的全局上下文,之后所有日志都会自动带上这个值,不用再手动拼接。修改你的代码如下:

class MyProgram {
    static void Main() {
        // 先初始化log4net(如果还没加的话,建议补上这一步)
        log4net.Config.XmlConfigurator.Configure();
        
        DateTime startTime = DateTime.Now;
        // 将启动时间存入全局上下文,指定格式让日志更规范
        log4net.GlobalContext.Properties["ProgramStartTime"] = startTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
        
        // 这里日志里就不用手动加startTime了
        Log.Info("Program started");
        MyMethod1();
        //...
    }

    static void MyMethod1() {
        Log.Info("method1 step1 ");
        // 业务代码
        Log.Info("method1 step2");
    }
}

步骤2:修改log4net配置文件,在日志模板中引用全局属性

接下来调整log4net的RollingFileAppender配置,让它在输出日志时自动带上我们设置的ProgramStartTime属性。找到配置里的Layout部分,修改conversionPattern:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <!-- 其他配置(文件路径、滚动策略等)保持不变 -->
    <layout type="log4net.Layout.PatternLayout">
        <!-- 在模板中加入%property{ProgramStartTime},位置可以根据你的需求调整 -->
        <conversionPattern value="%date [%thread] %-5level %logger - %property{ProgramStartTime} | %message%newline" />
    </layout>
</appender>

为什么这个方案更好?

  • 代码更简洁:不用在每一条日志语句里手动拼接启动时间,减少重复代码
  • 统一维护:启动时间的格式、是否显示,只需要在一处修改(要么是设置属性的地方,要么是配置文件)
  • 避免遗漏:再也不用担心某个方法里的日志忘了加启动时间

额外小提示

如果你的启动时间需要保留DateTime类型(比如后续有其他业务逻辑需要用到),可以把startTime作为静态字段保留,同时把它的字符串格式存入全局上下文,这样既能满足日志需求,也不影响业务使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:46:03