与Azure应用程序洞察、ASP.NET MVC和NLog的活动关联

Activity correlation with Azure Application Insights, ASP.NET MVC and NLog(与Azure应用程序洞察、ASP.NET MVC和NLog的活动关联)
本文介绍了与Azure应用程序洞察、ASP.NET MVC和NLog的活动关联的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何设置组合?配置Application InsightsNLog没有问题,但我不知道如何关联操作。我使用最新版本的NLog,因此它知道System.Diagnostics.Trace.CorrelationManager.ActivityId及其${activityid}变量。另一方面,应用程序洞察使用它自己的关联机制。我的问题是:

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

更新:

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

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

这是NLogLog()方法的包装器,该方法添加了一个可在NLog.config中作为${event-context:OperationId}引用的属性。CorrelationManager以下是@Aravind提供的链接的解决方案。使用SystemCallContext可确保操作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日志相关联。

推荐答案

如果您在.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:

  1. 安装程序包

    Install-Package NLog.DiagnosticSource或您的csproj:

    <PackageReference Include="NLog.DiagnosticSource" Version="1.*" />
    
  2. 添加到您的nlog.config:

    <extensions>
        <add assembly="NLog.DiagnosticSource"/>
    </extensions>
    
  3. 添加到nlog目标:

<target>中使用${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应用程序洞察、ASP.NET MVC和NLog的活动关联的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
quot;Overflowquot; compiler error with -9223372036854775808L(编译器错误-9223372036854775808L(Q;溢出Q))
Visual Studio 2010 ReportViewer Assembly References(Visual Studio 2010 ReportViewer程序集引用)
Weird behaviour when I open a reportviewer in WPF(在WPF中打开报表查看器时出现奇怪的行为)
how do i pass parameters to aspnet reportviewer(如何将参数传递给aspnet report查看器)