与 Azure Application Insights、ASP.NET MVC 和 NLog 的活动关联

Posted

技术标签:

【中文标题】与 Azure Application Insights、ASP.NET MVC 和 NLog 的活动关联【英文标题】:Activity correlation with Azure Application Insights, ASP.NET MVC and NLog 【发布时间】:2017-01-21 03:38:14 【问题描述】:

如何设置混音?我配置 Application InsightsNLog 没有问题,但我不知道如何关联操作。我使用最新版本的 NLog 所以它知道System.Diagnostics.Trace.CorrelationManager.ActivityId 及其$activityid 变量。另一方面,Application Insights 使用它自己的关联机制。我的问题是:

    谁负责初始化标准Trace.CorrelationManager.ActivityId?我以为是 ASP.NET MVC,但在调试器中它始终是 Guid.Empty。如果由我决定,在 MVC 管道中生成 id 的最佳位置在哪里? 如何让 Application Insights 使用Trace.CorrelationManager.ActivityId?或者,让 NLog 使用 Aplication Insights 的内部关联 ID? 如何确保 ID 在任何 Task.Run()await 调用中正确传播/恢复?

更新:

这是我最终将 AI 链接到 NLog 的结果:

    private void Log(LogEventInfo lei)
    
        lei.Properties["OperationId"] = CorrelationManager.GetOperationId();
        this.logger.Log(lei);
    

这是 NLogLog() 方法的包装,它添加了一个可以在 NLog.config 中引用为 $event-context:OperationId 的属性。 CorrelationManager 这是@Aravind 提供的链接中的解决方案。系统 CallContext 的使用保证了操作 Id 将流经所有异步点。现在,我们需要获取 AI 操作 id 并将其存储在 CorrelationManager 中。这是在Global.asax.cs 中完成的:

protected void Application_BeginRequest()

    RequestTelemetry telemetry = HttpContext.Current.GetRequestTelemetry();
    string operationId = telemetry?.Id ?? Guid.NewGuid().ToString();
    CorrelationManager.SetOperationId(operationId);

现在,如果您的应用启用了 AI,您的 NLog 日志将与 AI 日志相关联。

【问题讨论】:

您已经查看过这篇文章了吗? dzimchuk.net/post/event-correlation-in-application-insights 谢谢。是的,我找到了它并用作我的实验的基础。 @UserControl 我正在为我工​​作的公司实施类似的解决方案,您最终找到了一个不错的解决方案吗?介意分享一下吗?也许我可以为它贡献一点。 @Mvision,这仍然是一个已解决的问题,但我已经用我目前使用的内容更新了我的问题。 【参考方案1】:

如果您在 .net 核心应用程序(可能也是 .net 框架,但我尚未测试)中使用 Application Insights 2.1+,它们会自动将 System.Diagnostics.Activity.Current 设置为包含您可能想要的所有 Application Insights 信息的对象以及更多 (ref)。

在代码中,您可以使用System.Diagnostics.Activity.Current?.IdSystem.Diagnostics.Activity.Current?.RootId。 (使用调试器检查Activity.Current,看看还有什么,了解不同的nlog标签会输出什么)

要使用 nlog 记录它,请使用 NLog.DiagnosticSource package:

    安装包

    Install-Package NLog.DiagnosticSource 或在您的 csproj 中:

    <PackageReference Include="NLog.DiagnosticSource" Version="1.*" />
    

    添加到您的 nlog.config:

    <extensions>
        <add assembly="NLog.DiagnosticSource"/>
    </extensions>
    

    添加到一个 nlog 目标:

&lt;target&gt; 中使用$activity:property=TraceId(或Id 而不是TraceId,或many other properties they list 之一),例如:

<extensions>
    <add assembly="NLog.DiagnosticSource"/>
</extensions>
<targets>
    <target name="console" xsi:type="console" layout="$message|TraceId=$activity:property=TraceId" />
</targets>
<rules>
    <logger minLevel="Info" writeTo="console" />
</rules>

这将输出类似以下的日志消息:

My log message|TraceId=921af8f6ba994c9eb3832ebf200846d7

或使用Id 代替TraceId

My log message|Id=00-921af8f6ba994c9eb3832ebf200846d7-0e8ba5571915864b-00

【讨论】:

以上是关于与 Azure Application Insights、ASP.NET MVC 和 NLog 的活动关联的主要内容,如果未能解决你的问题,请参考以下文章

在Azure Application Insights中记录机器人数据

Azure Bot服务示例AuthenticationBot登录卡无法正常工作(application / vnd.microsoft.card.oauth)

Azure 应用程序网关和 Azure Application Insights 之间的关联

Azure Application Gateway 面向公网的Application Gateway

Azure Application Insights 不显示数据

使用 Application Insights 监控我的 Azure 功能