将多个 TraceSource 事件与 CorrelationManager 链接
本文关键字:CorrelationManager 链接 事件 TraceSource | 更新日期: 2023-09-27 18:31:48
我正在使用.NET WebAPI在C#中开发Web服务,我想将每个请求的多个事件记录到Windows事件日志中。 由于该服务在多线程模型中运行,并且每秒将收到数百个或请求,因此我需要能够按请求对日志条目进行分组,以便例如可以看到失败请求的所有条目。
计划是为每个请求和日志事件生成一个唯一的 Id (Guid),其严重性级别(详细/信息/错误/警告/严重)包括每个日志条目中的 Id,以便我可以对事件进行分组。
在尝试使用NLog之后,我开始研究System.Diagnostics.TraceSource与System.Diagnostics.Trace.CorrelationManager.ActivityId,以下是在线找到的文章,其中许多是关于SO的。 日志记录有效,但我被困在两个问题上。
我的网络配置:
<system.diagnostics>
<sources>
<source name="My.App" switchValue="Verbose, ActivityTracing">
<listeners>
<add name="eventlogListener" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="eventlogListener" type="System.Diagnostics.EventLogTraceListener" initializeData="MyAppCategory" />
</sharedListeners>
</system.diagnostics>
问题1
- 如果我使用跟踪传输,我可以指定 ActivityId(即自动附加到消息中),但我无法指定事件级别(例如TraceEventType.Error)
- 如果我使用 TraceEvent,我可以指定级别,但不能指定 ActivityId,并且活动 ID 不会出现在任何地方
有没有办法在日志事件中同时拥有级别和活动 ID?
问题2
我希望在事件查看器的"相关 ID"列中看到 ActivityId,以便对事件进行分组。 我看到一些应用程序在那里存储了 Guid,但我还没有找到任何关于如何在 C#/.NET 中实现相同目标的文档。 我注意到 TraceEvent 接受一个 object[] args 参数,但我还没有找到任何示例。
任何人都可以指出我一些文档或提供一个工作示例吗?
谢谢
将 traceOutputOptions
属性添加到eventlogListener
定义中:
traceOutputOptions="LogicalOperationStack"
生成的元素将是:
<add name="eventlogListener" type="System.Diagnostics.EventLogTraceListener" initializeData="MyAppCategory" traceOutputOptions="LogicalOperationStack"/>
生成的输出将与此非常相似:
testtrace Start: 0 : Main task started
LogicalOperationStack=Main
testtrace Information: 0 : Doing work for id 0
LogicalOperationStack=0, Main
请注意输出如何为您提供逻辑操作的嵌套堆栈。在此示例中,操作0
是在单独的线程中启动的。