NLog cached布局变量多次调用取值不同,如何让其仅执行一次求值?
解决方案
你遇到的问题本质是NLog配置变量默认采用延迟求值策略,只有第一次被调用时才会计算值,所以不同target首次触发日志写入的时间不同,就会生成不同的时间戳。你可以通过以下两种方式实现变量仅在程序启动时求值一次:
方法1:修改配置变量属性(推荐)
NLog的<variable>标签支持lazy属性,设置为false后,NLog加载配置时就会立刻计算变量值,后续所有引用都会复用这个固定值,不需要额外加${cached}包装。
修改后的变量配置如下:
<variable name='blobprefix' value='${date:format=yyyy-MM-ddTHH.mm.ss}' lazy="false" />
target部分的配置不需要做任何修改。
方法2:代码层面手动赋值
如果需要更灵活的控制,也可以在程序启动、NLog初始化完成后手动给全局变量赋值:
// 程序启动入口处执行 string logPrefix = DateTime.Now.ToString("yyyy-MM-ddTHH.mm.ss"); NLog.LogManager.Configuration.Variables["blobprefix"] = logPrefix; // 刷新所有日志记录器使配置生效 NLog.LogManager.ReconfigExistingLoggers();
原配置失效原因说明
你之前使用的${cached}布局渲染器虽然会缓存计算结果,但缓存是基于首次调用时机生成的,三个target如果首次写入日志的时间不一致,会分别触发一次计算,最终得到三个不同的时间戳。
内容的提问来源于stack exchange,提问作者Panke
相关产品推荐
相关产品推荐

