2

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

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

在尝试使用 NLog 之后,我开始研究System.Diagnostics.TraceSource与System.Diagnostics.Trace.CorrelationManager.ActivityId的结合,在网上找到了以下文章,其中很多都在 SO 上。日志记录有效,但我遇到了两个问题。

我的 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,并且 Activity Id 不会出现在任何地方

有没有办法在日志事件中同时拥有级别和活动 ID?

问题 2

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

谁能指出我一些文档或提供一个工作示例?

谢谢

4

1 回答 1

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

于 2014-02-12T11:59:44.023 回答