好的,不要笑。 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。 [噱头]
哪种方法适用于详细/调试级别?
编辑:从标题中删除“Easy one”。显然不是。
你所描述的是 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 你添加到你的 TraceSource的 Listeners 采集。你使自己的类派生自 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 采集
我想添加自己的故事。
我的问题的简单答案是 Trace.WriteLine 是有效的冗长。但是,.NET跟踪功能强大但很复杂,但我设法让它在Table Storage中运行。
我的绊脚石一直在追踪致命的消息。由于临界级别消息没有静态方法,因此我不得不使用这些方法 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 如果它开始成本,并回到它。
卢克