我們的程式總是會出現各種各樣的問題,有時發生問題的環境並不在身邊,為了應付情況,我們需要懂得如何在系統啟動並執行過程中獲得儘可能多的資訊,.NET架構套件含了一些類,可以協助我們產生診斷資訊。這些類可以在運行時或者編譯階段進行配置,合理的運用它們,我們可以更快的發現問題。
這些類包括:
System.Diagnostics.Debug
System.Diagnostics.Trace
System.Diagnostics.EventLog
其中Debug和Trace很像,區別在於Trace是由TRACE指令建立的,而Debug指令是由DEBUG指令建立的。預設情況下,TRACE指令在debug和release兩種模式下都定義了,而DEBUG指令只是在debug模式下進行了定義。EventLog類提供了入口使得應用程式可以寫到系統事件日誌中,它不支援運行時配置。
下面我們來看如何通過Trace類輸出調試資訊,整體的結構分為兩部分,一部分通過設定TraceSwitch來設定輸出資訊的層級;一部分通過設定Listener來設定如何將資訊輸出。
我們可以在應用程式設定檔中設定TraceSwtich的資訊,如下。
代碼
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<switches>
<add name="MyDebugTool" value="3"/>
</switches>
</system.diagnostics>
</configuration>
我們在定義Switch的Value值時,是按照TraceLevel的枚舉值進行設定的,TraceLevel的枚舉值包括:Off、Error、Warning、Info和Verbose,分表表示0到4。
我們需要在程式中執行個體化TraceSwitch資訊,並且可以定製自己的Listener,來看下面的代碼。
代碼
internal class MyListener : TraceListener
{
public override void Write(string message)
{
Console.Out.Write(message);
}
public override void WriteLine(string message)
{
Console.Out.WriteLine(message);
}
}
internal class TraceUtility
{
private static TraceSwitch myTraceSwitch = new TraceSwitch("MyDebugTool", "my debug assist tool");
static TraceUtility()
{
MyListener myListener = new MyListener();
myListener.Name = "MyListener";
myListener.IndentLevel = 0;
Trace.Listeners.Add(myListener);
//Trace.Listeners.Add(new TextWriterTraceListener(System.Console.Out));
Trace.Listeners.Add(new TextWriterTraceListener(System.IO.File.CreateText("Output.log")));
}
public static void OutputInfo(TraceLevel level, string message)
{
Trace.WriteLineIf(myTraceSwitch.Level > level, message);
Trace.Flush();
}
}
上述代碼中首先定義了一個Listener,注意它必須派生自TraceListener類;另外定義了一個TraceUtility類,用於執行個體化TraceSwitch對象,並對外公開記錄診斷資訊的介面。
下面是測試方法。
代碼
1 private static void Test()
2 {
3 TraceUtility.OutputInfo(TraceLevel.Warning, "Trace Start");
4 //do something
5 TraceUtility.OutputInfo(TraceLevel.Warning, "Trace End");
6 }
上面的代碼只是一個示範說明的作用,在進入方法和離開方法時,記錄了相關的診斷資訊。
測試方法執行後,一方面會在控制台上輸出對應的診斷資訊;另一方面也會在exe所在的目錄建立一個名為Ouput.log的文字檔,會將所有診斷資訊寫入到這個文字檔中。
當我們將設定檔中對應的Switch的Value值設定為0後,在運行程式,你會發現控制台中不會輸出任何東西,但是文字檔中還是會輸出所有的診斷資訊。
診斷程式庫對診斷和維護發行的程式來說是必需的,我們可以利用.NET架構提供的用於調試診斷的類來完成這項任務,當它們不滿足我們的需求時,我們可以對其進行擴充。