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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:36:04