Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用'System.Diags…Trace'在详细级别进行日志记录`_C#_.net_Instrumentation_Trace - Fatal编程技术网

C# 如何使用'System.Diags…Trace'在详细级别进行日志记录`

C# 如何使用'System.Diags…Trace'在详细级别进行日志记录`,c#,.net,instrumentation,trace,C#,.net,Instrumentation,Trace,好吧,别笑。2005年,我读到关于使用System.Diagnosticsnamespace进行跟踪的文章,这很复杂,从那以后我就一直使用log4net和NLog(其他人也是如此) 今天,我的应用程序将托管在Windows Azure网站上,并使用我们的老朋友Trace 自鸣得意的是,我总是使用抽象,IoC,所以我只是写了一个新的小垫片来使用Trace编写,但它只有TraceInformation,TraceWarning和TraceError 有一些Write*方法,但我不知道它们会在什么情

好吧,别笑。2005年,我读到关于使用
System.Diagnostics
namespace进行跟踪的文章,这很复杂,从那以后我就一直使用log4net和NLog(其他人也是如此)

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

自鸣得意的是,我总是使用抽象,IoC,所以我只是写了一个新的小垫片来使用
Trace
编写,但它只有
TraceInformation
TraceWarning
TraceError

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

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


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

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

这与.NET中的跟踪诊断功能相差甚远

进行跟踪的最好方法是创建一个
TraceSource
。在
TraceSource
类中,有一个
Switch
属性,该属性依次具有一个
Level
属性,在该属性中,您可以定义特定
TraceSource
所需的详细级别。您可以使tracesource侦听所有级别:

var ts = new TraceSource("My Verbose Debugger") {Switch = {Level = SourceLevels.All}};
然后要跟踪某个对象,您可以跟踪到该源,在该源中指定级别,如下所示:

ts.TraceData(TraceEventType.Verbose, 0, dataToBeTraced);
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
  }
}
TraceListener, v4.0_4.0.0.0__b77a5c561934e089\System.dll
RDEventMonitoringAgentListener, MonAgentListener.dll
DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics.dll
0
是跟踪的id,
dataToBeTraced
是一个具有要跟踪的特定数据的对象(它是一个
params[]object
参数,因此如果愿意,可以传入多个对象)

现在如何使用这些数据?使用添加到
TraceSource
侦听器
集合中的
TraceStener
。您可以从
TraceListener
生成自己的类,并重写
TraceData
方法,如下所示:

ts.TraceData(TraceEventType.Verbose, 0, dataToBeTraced);
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
  }
}
TraceListener, v4.0_4.0.0.0__b77a5c561934e089\System.dll
RDEventMonitoringAgentListener, MonAgentListener.dll
DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics.dll
侦听器可以在多个tracesources之间共享,并且它将只接收
TraceSwitch
级别允许的数据级别

System.Diagnostics.Trace
使用这样的侦听器(默认情况下添加到
Debug.Listeners
Trace.Listeners
),但在内部,它的工作方式与我描述的一样

这一切一开始可能看起来有点混乱,但它真的很强大,一旦你有了一组助手类。。。至少我已经停止使用第三方日志库,并在很大程度上使用了它

至于Azure,这纯粹是猜测,因为我从未做过任何Azure,但我想您应该在
app.config
中这样配置您的tracesource(可能
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
添加到它的
侦听器
集合

我想添加我自己的故事

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

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

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

我的绊脚石是恰当地追踪致命信息。由于没有用于关键级别消息的静态方法,因此我不得不使用
TraceSource
上的方法并传入所需的级别枚举

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

然而,正如Jcl所解释的那样,仅仅更新一个
TraceSource
并没有什么作用,因为它需要一个监听器。这就是我现在的困境所在

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

_traceSource = new TraceSource(name, SourceLevels.All);
_traceSource.Listeners.Add(listener);
这需要在SDK中本地引用
Microsoft.WindowsAzure.Diagnostics
,但奇怪的是它没有编译

那里的演员阵容不行,反正我也不需要

错误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

奇怪的是,红门反射器显示了如下继承链:

ts.TraceData(TraceEventType.Verbose, 0, dataToBeTraced);
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
  }
}
TraceListener, v4.0_4.0.0.0__b77a5c561934e089\System.dll
RDEventMonitoringAgentListener, MonAgentListener.dll
DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics.dll
如果我在那里反映我的
TraceSource
类,那么它(也)来自:

奇怪。我现在放弃了。我有一个产品要发货。我将恢复使用static
Trace
类,如果价格开始上涨,我会重新使用它


Luke

我相信
TraceInformation
是为你所说的verbose而设计的。@500 InternalServerError No,
信息
verbose
是两个不同的层次。这是一个很好的答案。今天早上我刚刚学到了同样的东西,关于
TraceSource.TraceData |事件
。但这是配置这开始是下一个谜团,你发现的
Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorRaceListener
可能会掌握关键。谢谢,我稍后会更新。如上所述,我没有做任何Azure,所以我在猜测。不过我一直对开始感兴趣,所以我有一些谷歌的小新闻