如何使用“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
编写,但它只有 TraceInformation
、TraceWarning
和 TraceError
.
有一些 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
添加到 TraceSource
的 Listeners
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.Listeners
和 Trace.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,如果它开始收费,我会回来使用它。
卢克
好了别笑了。 2005 年,我读到有关使用 System.Diagnostics
命名空间进行跟踪的信息,它很复杂,从那以后我就一直使用 log4net 和 NLog(其他人也是如此)。
今天,我的应用程序将托管在 Windows Azure 网站上,并使用我们的老朋友 Trace
。
http://azure.microsoft.com/en-gb/documentation/articles/web-sites-enable-diagnostic-log/
自鸣得意,我总是使用抽象,IoC,所以我只是在写一个新的小填充程序来使用 Trace
编写,但它只有 TraceInformation
、TraceWarning
和 TraceError
.
有一些 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
添加到 TraceSource
的 Listeners
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.Listeners
和 Trace.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,如果它开始收费,我会回来使用它。
卢克