如何在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
相关产品推荐
相关产品推荐

