问题 如何使用`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 但它只有 TraceInformationTraceWarning 和 TraceError

有一些 Write* 方法,但我不知道他们最终会在什么情况下结束。可怕的API。 [噱头]

哪种方法适用于详细/调试级别?

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


9593
2018-03-03 18:04


起源

我相信 TraceInformation 是为了你所谓的详细。 - 500 - Internal Server Error
@ 500-InternalServerError nope, Information 和 Verbose 有两个不同的层次 - Jcl


答案:


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

这远不是.NET中跟踪诊断的强大功能

最好的跟踪方法是创建一个 TraceSource。在一个 TraceSource 上课有一个 Switch 依次拥有的财产 Level 属性,您可以在其中定义特定级别的详细级别 TraceSource。你可以让traceource听取所有级别:

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

然后跟踪某些内容,您将跟踪到指定级别的源,如下所示:

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

0 是跟踪的id和 dataToBeTraced 是一个具有您想要跟踪的特定数据的对象(它是一个 params [] object 参数,如果你愿意,你可以传入许多对象)。

现在怎么样 使用 那数据?用一个 TraceListener 你添加到你的 TraceSourceListeners 采集。你使自己的类派生自 TraceListener 并覆盖 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
  }
}

监听器可以在许多traceource之间共享,它只接收它的数据级别 TraceSwitch 等级允许。

System.Diagnostics.Trace 使用像这样的听众( DefaultTraceListener)默认添加到两者 Debug.Listeners 和 Trace.Listeners,但在内部,它按照我的描述工作。

这一切看起来有点令人困惑,但它真的很强大,一旦你有一组辅助类...至少我,已经停止使用第三方日志库并在很大程度上使用它。

至于Azure, 这是纯粹的推测,因为我从未做过任何Azure,但我想你会在你的配置中配置这样的traceource 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 采集


11
2018-03-04 10:29



这是一个很好的答案。关于,我今天早上刚刚学到了同样的东西 TraceSource.TraceData|Event。但它的配置开始成为下一个谜团和你的发现 Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener 可能掌握了关键。谢谢,我稍后会更新。 - Luke Puplett
如上所述,我没有做任何Azure,所以我猜测。但是我一直对开始感兴趣所以我在这里和那里都有谷歌信息 - Jcl
我没有配置,所以WAWS必须自己添加它。如果我通过摩纳哥启用编辑,我可能会在web.config中看到它。无论如何,我现在将切换到管理控制台中的错误级别,看看我的 WriteLine 语句被忽略。如果没有,我会更换静电 Trace 用一个 TraceSource 并看看我是否可以打破它,并可能使用配置再次修复它。 - Luke Puplett
实际上,它的工作就是这样 Trace.WriteLine 很冗长。但我对重用不满意 TraceError 对于致命,所以我会尝试使用 TraceSource 现在看看会发生什么。 - Luke Puplett


我想添加自己的故事。

我的问题的简单答案是 Trace.WriteLine 是有效的冗长。但是,.NET跟踪功能强大但很复杂,但我设法让它在Table Storage中运行。

  • 在Azure门户中,启用“配置”选项卡下的“应用程序日志记录”(表存储)并设置表。如果您创建一个新的,则在保存更改之前不会显示。

  • 在您的应用程序中,您只需要使用方法 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);

这需要参考 Microsoft.WindowsAzure.Diagnostics 在SDK本地,但奇怪的是不编译。

那场演员阵容无效。反正我甚至都不需要它。

错误3无法转换类型   'Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener'来   '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 在那里上课,它(也)来自:

v4.0_4.0.0.0__b77a5c561934e089\System.dll

奇。我现在放弃了。我有一个产品要发货。我将恢复使用静态 Trace 如果它开始成本,并回到它。

卢克


3
2018-03-04 13:33



我知道你说你放弃了,但检查一下: cryclops.com/2013/09/...  他们通过添加 DiagnosticMonitorTraceListener 一个名字 TraceSource 通过将其添加到配置文件,它似乎工作 - Jcl
谢谢你找到了这个。你是一个很好的帮助。 - Luke Puplett
我很高兴我去过。如果你碰巧让它最终运作,请在你有时间的时候分享......正如我所说,我打算在将来尝试使用azure来节省一些麻烦:-) - Jcl
我会试着记住(我通常很好)。如果有人读这篇文章想要插话,请做。完了,走吧。 - Luke Puplett
我也面临同样的问题。但是我通过添加MonAgentListener程序集的引用来解决它,它是azure SDK的一部分。 - Dilip Nannaware