【问题标题】:Using NLog's aspnet-item:variable inside Task.Run?在 Task.Run 中使用 NLog 的 aspnet-item:variable?
【发布时间】:2021-03-15 10:35:56
【问题描述】:

我的 Nlog.config 包含这个模板:

 <target xsi:type="Console" name="Console"
            layout="${aspnet-item:variable:requestId} ${newline} ..." />

我正在使用 .net core(带有 docker)。

在等待代码中,我确实看到了 item:variable:requestId 的值,因为我使用了:

 _httpContextAccessor.HttpContext.Items["requestId"] = "dummyvalue";

所以 nlog 可以从上下文中读取它。

但是,如果我的 loggerServiceTask.Run 内运行,那么我看不到值。 (因为 Task.run 没有 HttpContext

问题:

是否有可以手动设置aspnet-item:variable:requestId 值的代码API? 还是有其他选择?

【问题讨论】:

    标签: .net-core nlog


    【解决方案1】:

    在代码中:

    MappedDiagnosticsLogicalContext.Set("MyValueName", myValue);
    

    在 Nlog.config 中:

    <target layout="${mdlc:item=MyValueName}" includeMdlc="true">
    

    【讨论】:

    • 如果我把它放在 task.run 中,它会影响不在 task.run 中的其他代码吗?
    • 视情况而定。一般来说,这个值会在整个通话中持续存在,并且很好,例如用于请求相关 ID。另一方面,我们在为每个任务生成一个新 ID 的后台作业中使用这种方法,这很有效。因此,对于您的情况,可能不是一个完整的解决方案,但可能会让您走得更远。
    • 我希望它用于整个通话。所以如果主线程 A 创建 Task.Run B ,那么我希望 B 将包含 A 的信息。我在询问请求 C。它会看到 A 的值吗?
    • 不,如果您拨打两个电话,例如到一个 REST 端点,每个线程都有自己的值。
    猜你喜欢
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多