Effective C# Item36:合理使用.NET運行時診斷

來源:互聯網
上載者:User

    我們的程式總是會出現各種各樣的問題,有時發生問題的環境並不在身邊,為了應付情況,我們需要懂得如何在系統啟動並執行過程中獲得儘可能多的資訊,.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架構提供的用於調試診斷的類來完成這項任務,當它們不滿足我們的需求時,我們可以對其進行擴充。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.