C# 如何使用'System.Diags…Trace'在详细级别进行日志记录`
好吧,别笑。2005年,我读到关于使用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*方法,但我不知道它们会在什么情
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门户中,在“配置”选项卡下打开应用程序日志记录(表存储),然后设置表。如果创建一个新的,则在保存更改之前,它不会显示
- 在应用程序中,您只需要使用
上的方法,WAWS就会自动设置所需的侦听器System.Diagnostics.Trace
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
类,那么它(也)来自:
奇怪。我现在放弃了。我有一个产品要发货。我将恢复使用staticTrace
类,如果价格开始上涨,我会重新使用它
Luke我相信
TraceInformation
是为你所说的verbose而设计的。@500 InternalServerError No,信息和verbose
是两个不同的层次。这是一个很好的答案。今天早上我刚刚学到了同样的东西,关于TraceSource.TraceData |事件
。但这是配置这开始是下一个谜团,你发现的Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorRaceListener
可能会掌握关键。谢谢,我稍后会更新。如上所述,我没有做任何Azure,所以我在猜测。不过我一直对开始感兴趣,所以我有一些谷歌的小新闻