NLog:如果多次使用,具有缓存布局的变量会产生不同的值

Posted

技术标签:

【中文标题】NLog:如果多次使用,具有缓存布局的变量会产生不同的值【英文标题】:NLog: variable with cached layout yields different values if used multiple times 【发布时间】:2021-12-01 17:48:23 【问题描述】:

我登录到 Azure Blob 存储,并希望每次启动有一个三个日志文件(包含不同的内容),为此我使用缓存的时间戳。理想情况下,三个文件中的时间戳应该相同,但如果我在不同时间登录到特定目标,它们会有所不同。

我这样设置变量

<variable name='blobprefix' value='$cached:cached=true:Inner=$date:format=yyyy-MM-dd\\THH.mm.ss' />

这就是我对每个 blob 使用它的方式:

<target type="AzureBlobStorage"
    name="general-azureblob"
    connectionString="$blobConnection"
    blobName="$blobprefix.log"> 
</target>

如何让变量只计算一次。

【问题讨论】:

【参考方案1】:

您可以像这样使用$processinfo:StartTime:

<variable name='blobprefix' value='$processinfo:StartTime:format=yyyy-MM-dd\\THH.mm.ss:cached=true' />

如果你想控制 StartTime,那么你可以使用NLog GDC 并在应用程序启动时执行以下操作(在创建第一个 NLog Logger 对象之前):

NLog.GlobalDiagnosticsContext.Set("StartupTime", DateTime.UtcNow);

并且在 NLog.config 中有以下内容(whenEmpty 仅作为后备存在):

<variable name='blobprefix' value='$gdc:StartupTime:format=yyyy-MM-dd\\THH.mm.ss:cached=true:whenEmpty:$date:format=yyyy-MM-dd\\THH.mm.ss:cached=true' />

【讨论】:

谢谢,我没有直接使用 NLog,而是通过 Microsoft.Extensions.Logging,但我会尝试一下。 @Panke 使用 $processinfo:StartTime 作为替代方法更新了答案。则无需分配 GDC。 谢谢,我正在使用您的建议。效果很好。

以上是关于NLog:如果多次使用,具有缓存布局的变量会产生不同的值的主要内容,如果未能解决你的问题,请参考以下文章

具有独特着色器的 OpenGL 多次绘制调用会产生空白屏幕

如何使用 NLog 以功能方式登录 F#

android磁盘缓存与内存缓存

多次调用打印函数后未定义的行为

使用具有多个线程的Nlog发出在数据库中写入日志

使用 NLog 事件上下文布局渲染器以毫秒精度记录日期时间