使用CorrelationManager链接多个TraceSource事件

时间:2013-09-19 01:05:40

标签: c# multithreading logging asp.net-web-api system.diagnostics

我正在使用.NET WebAPI在C#中开发Web服务,我想将每个请求的多个事件记录到Windows事件日志中。由于服务在多线程模型中运行并且每秒将接收数百或请求,因此我需要能够按请求对日志条目进行分组,以便我可以查看失败请求的所有条目。例如。

计划是为每个具有严重性级别(详细/信息/错误/警告/严重)的请求和日志事件生成唯一的Id(Guid),包括每个日志条目中的Id,以便我可以对事件进行分组

尝试使用NLog后,我开始在 System.Diagnostics.Trace.CorrelationManager.ActivityId 中查看 System.Diagnostics.TraceSource ,以下文章在网上找到,很多在这里。记录有效,但我遇到了两个问题。

我的web.config:

<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

  • 如果我使用 TraceTransfer ,我可以指定ActivityId(即 自动附加到消息)但我无法指定事件级别(例如 TraceEventType.Error)
  • 如果我使用 TraceEvent 我可以指定级别但不能指定ActivityId,并且活动ID不会出现在任何地方

是否有办法在日志事件中同时具有级别和活动ID?

问题2

我想在事件查看器的“Correlation Id”列中看到ActivityId,以便我可以对事件进行分组。我已经看到一些存储Guid的应用程序,但我没有找到任何关于如何在C#/ .NET中实现相同的文档。我注意到 TraceEvent 接受了一个 object [] args 参数,但我没有找到任何例子。

有人能指点我一些文档或提供一个有效的例子吗?

谢谢

1 个答案:

答案 0 :(得分:-1)

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是在单独的线程中启动的。