如何使用“System.Diags...Trace”以详细级别登录

How do I log at verbose level using `System.Diags...Trace`

好了别笑了。 2005 年,我读到有关使用 System.Diagnostics 命名空间进行跟踪的信息,它很复杂,从那以后我就一直使用 log4net 和 NLog(其他人也是如此)。

今天,我的应用程序将托管在 Windows Azure 网站上,并使用我们的老朋友 Trace

http://azure.microsoft.com/en-gb/documentation/articles/web-sites-enable-diagnostic-log/

自鸣得意,我总是使用抽象,IoC,所以我只是在写一个新的小填充程序来使用 Trace 编写,但它只有 TraceInformationTraceWarningTraceError.

有一些 Write* 方法,但我不知道它们会在哪里结束以及在什么情况下结束。可怕 API。 [堵嘴]

verbose/debug级别的方法是什么?

编辑:从标题中删除了 "Easy one"。显然不是。

您描述的是 System.Diagnostics.Trace class,它确实有一些简单的方法可以写入诊断跟踪输出。

这与 .NET 中的跟踪诊断的强大程度相去甚远

最好的跟踪方法是创建一个 TraceSource。在 TraceSource class 中有一个 Switch 属性,它又有一个 Level 属性,您可以在其中定义您想要的冗长级别具体TraceSource。您可以让该跟踪源监听所有级别:

var ts = new TraceSource("My Verbose Debugger") {Switch = {Level = SourceLevels.All}};

然后要追踪某些东西,您可以追踪到那个来源,您可以在其中指定级别,如下所示:

ts.TraceData(TraceEventType.Verbose, 0, dataToBeTraced);

0 是跟踪的 ID,dataToBeTraced 是一个 object,其中包含您要跟踪的特定数据(它是一个 params [] object 参数,因此您如果你愿意,可以传入许多 object。

现在如何使用该数据?使用 TraceListener 添加到 TraceSourceListeners collection。您从 TraceListener 派生自己的 class 并覆盖 TraceData 方法,如下所示:

class MyTraceListener : TraceListener
{
  public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, params object[] data)
  {
    base.TraceData(eventCache, source, eventType, id, data);
    // do what you want with the objects in the "data" parameter
  }
}

侦听器可以在多个跟踪源之间共享,它只会接收其 TraceSwitch 级别允许的数据级别。

System.Diagnostics.Trace 使用像这样的侦听器(DefaultTraceListener),它默认添加到 Debug.ListenersTrace.Listeners,但在内部,它按照我描述的方式工作.

这一切一开始可能看起来有点混乱,但它真的很强大,一旦你有了一套助手 classes...至少我已经停止使用 third-party 日志记录库并在很大程度上使用它。

至于 Azure,这纯属猜测,因为我从未使用过任何 Azure,但我想您会在 app.config 中像这样配置跟踪源(也许 web.config?不确定 web),为日志添加一个默认的 azure 侦听器:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <sharedListeners>
       <add name="AzureListener" type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
           <filter type="" />
       </add>
    </sharedListeners>        
    <sources>
      <source name="MyTraceSource" switchValue="Verbose" >
         <listeners>
            <add name="AzureListener" />
         </listeners>
      </source>
   </sources>
 </system.diagnostics>
</configuration>

"MyTraceSource" 是您在通过代码执行此操作时在构造函数中给您 TraceSource 的字符串名称。

或者你可以在上面的代码中创建一个 TraceSource,然后将 Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener 添加到它的 Listeners collection

我想添加我自己的故事。

我的问题的简单答案是 Trace.WriteLine 实际上很冗长。然而,.NET 跟踪功能强大但复杂,但我设法将其用于 Table 存储。

  • 在 Azure 门户中,在配置选项卡下打开应用程序日志记录(Table 存储)并设置您的 table。如果您创建一个新的,在您保存更改之前它不会出现。

  • 在您的应用程序中,您只需使用 System.Diagnostics.Trace 上的方法,WAWS 将自动设置必要的侦听器。

我的绊脚石一直是适当地跟踪致命消息。由于关键级别消息没有静态方法,我不得不使用 TraceSource 上的方法并传入我想要的级别枚举。

例如,在我的日志记录抽象中,级别为 LoggingLevel.Fatal,我需要调用 TraceSource.TraceEvent(TraceEventType.Critical, ...

然而,仅仅更新一个 TraceSource 什么都不做,因为正如 Jcl 解释的那样,它需要一个监听器。这就是我现在被困的地方。

var listener = (TraceListener)new Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener();

_traceSource = new TraceSource(name, SourceLevels.All);
_traceSource.Listeners.Add(listener);

这需要在本地 SDK 中引用 Microsoft.WindowsAzure.Diagnostics,但奇怪的是它无法编译。

那里的演员表不起作用。反正我什至不需要它。

Error 3 Cannot convert type 'Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener' to 'System.Diagnostics.TraceListener' Evoq.AppName.CoreLib C:\DATA\Code\AppName\Evoq.AppName\Evoq.AppName.CoreLib\Instrumentation\AzureApplicationDiagnosticsLogger.cs 30 28

奇怪的是 RedGate Reflector 显示了这样的继承链:

TraceListener, v4.0_4.0.0.0__b77a5c561934e089\System.dll
RDEventMonitoringAgentListener, MonAgentListener.dll
DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics.dll

如果我在那里反映我的 TraceSource class,它(也)来自:

v4.0_4.0.0.0__b77a5c561934e089\System.dll

奇怪。我现在要放弃了。我有一个产品要发货。我将恢复使用静态 Trace class,如果它开始收费,我会回来使用它。

卢克