为啥 NLog 不将范围数据记录到 Application Insights 自定义维度

Posted

技术标签:

【中文标题】为啥 NLog 不将范围数据记录到 Application Insights 自定义维度【英文标题】:Why is NLog not logging scope data to Application Insights custom Dimensions为什么 NLog 不将范围数据记录到 Application Insights 自定义维度 【发布时间】:2021-11-09 21:54:12 【问题描述】:

我目前正在使用在 nlog.config 文件中配置的 NLog 登录到 Application Insights。我没有在任何地方设置IncludeScopes(默认情况下是真的)。​​

我正在尝试使用范围记录自定义属性。它在登录到文件或控制台时有效,但在登录到 Application Insights customDimensions 时无效。

这就是我记录范围的方式:

using (_logger.BeginScope(new Dictionary<string, object>  ["ActivityId"] = Guid.NewGuid())

    _logger.LogInformation("Logging from with scope");

这是 nlog.config 文件:

<target name="applicationInsights" xsi:type="ApplicationInsightsTarget" >
    <instrumentationKey>8d9f67d5-fe36-45cf-935f-2f87bb240b12</instrumentationKey>
    <!-- Only required if not using ApplicationInsights.config -->
    <contextproperty name="threadId" layout="$threadid" />
    <contextproperty name="processName" layout="$processname" />
    <!-- Can be repeated with more context -->
</target>

很遗憾,当我在 Application Insights 中查看 customDimensions 时,我没有看到 ActivityId。

我在 Azure 中运行我的控制台应用程序,因此注册了一个工作服务(处理消息),如下所示:

services.AddHostedService<PositionMessageProcessor>()

我需要做什么才能获得日志记录范围以在 Application Insights 中记录我的 ActivityId?

更新

我已经设法通过将 ActivityId 添加为特定的contextProperty 来记录它。我真的不想每次使用不同属性调用 BeginScope(...) 时都必须更新配置文件。

有没有一种通用的方法让它适用于所有范围属性?

【问题讨论】:

等一下:github.com/microsoft/ApplicationInsights-dotnet/pull/2103 【参考方案1】:

是否有一种通用的方法让它适用于所有范围属性?

我假设您的意思是将所有范围属性发送到应用程序洞察力,而不指定哪些键。

目前目标不支持此功能,请参阅source。

在 NLog 4 中,范围属性被推送到 NestedDiagnosticsLogicalContext

您可以通过创建自己的目标来做到这一点:

    从source复制目标 在BuildPropertyBag 中的NestedDiagnosticsLogicalContext.GetAllObjects() 中循环ApplicationInsightsTarget。 注册你的目标,见NLog-Register your custom component

【讨论】:

这仅在使用TargetWithContext 时有效。另见github.com/microsoft/ApplicationInsights-dotnet/pull/2103【参考方案2】:

您可以使用 &lt;contextproperty&gt; 和 JsonLayout 将范围上下文包含为 blob 数据:

<target type="ApplicationInsightsTarget" name="aiTarget">
        <contextProperty name="scopeproperties">
            <layout type="JsonLayout" includeMdlc="true" />
        </contextProperty/>
</target>

【讨论】:

以上是关于为啥 NLog 不将范围数据记录到 Application Insights 自定义维度的主要内容,如果未能解决你的问题,请参考以下文章

使用Nlog记录日志到数据库

为啥不将其添加到数据库中?

为啥 axios 不将数据发布到服务器进行条带化?

NLog记录日志到Oracle数据库

为啥不将 FirebaseDatabase 引用中的所有数据都添加到 ArrayList<String> 中?

为啥 RestTemplate 不将响应表示绑定到 PagedResources?