1

我目前正在使用在 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(...)使用不同的属性调用时都必须更新配置文件。

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

4

2 回答 2

1

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

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

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

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

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

  1. 从源复制目标
  2. NestedDiagnosticsLogicalContext.GetAllObjects()BuildPropertyBag里面循环ApplicationInsightsTarget
  3. 注册您的目标,请参阅NLog-注册您的自定义组件
于 2021-09-15T21:21:13.607 回答
1

您可以使用<contextproperty>带有JsonLayout的 a 将范围上下文包含为 blob 数据:

<target type="ApplicationInsightsTarget" name="aiTarget">
        <contextProperty name="scopeproperties">
            <layout type="JsonLayout" includeMdlc="true" />
        </contextProperty/>
</target>
于 2021-09-16T08:13:25.087 回答