与 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 Insights 和 NLog 没有问题,但我不知道如何关联操作。我使用最新版本的 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);
这是 NLog 的 Log()
方法的包装,它添加了一个可以在 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?.Id
或System.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 目标:
在<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 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