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

來源:互聯網
上載者:User

當有問題發生時,它們往往並不是在實驗的時候發生的,機器有輕鬆調試的工具。在很多實際情況中,你不好修正的問題總是發生在使用者的機器上,那裡沒有調試環境,也沒有好的方法計算出問題的情況。在實際情況中,有經驗的開發人員會建立一個方法,讓系統在運行時捕獲儘可能多的資訊。.Net架構已經包含一些類集合,利用這些集合,你可以做一些通用的調試。而且這些類可以在運行時或者編譯時間進行配置。如果你利用它們,你就可以輕鬆的發現在實際運行時的問題。使用架構裡已經存在的代碼,你可以發送一條診斷資訊到一個檔案,或者到調試終端。另外,你還可以為你的產品指定特殊的調試輸出層級。你應該儘快的在你的開發環境中使用這些功能,以確保你可以利用這些輸出資訊來修正在實際運行中沒有預料到的一些問題。不要自己寫診斷庫除非你已經明白架構已經提供了哪些。

System.Diagnostics.Debug, System.Diagnostics.Trace和System.Diagnostics.EventLog類提供了你在運行程式時要建立診斷資訊的所有工具。前面兩個類功能是基本上是一樣的。不同之外是Trace類是由預先處理符TRACE控制的,而Debug類則是由DEBUG預先處理符控制的。當你用VS.net開發一個項目時,TRACE符號是同時在調試版和發布版中定義的。你可以為所有的發布版使用Trace類來建立診斷資訊。EventLog類提供了一個入口,通過這個入口,你的程式可以寫一些系統日誌。EventLog類不支援運行時配置,但你可以把它封裝到一個統一的簡單介面中。

你可以在運行時控制診斷輸出,.Net架構使用一個應用程式設定檔來控制變化多樣的運行時設定。這個是一個XML檔案,在主應用程式運行時的目錄中。這個檔案與應用程式同名,但添加了一個.config尾碼。務更制塊例如MyApplication.exe 可能會有一個MyApplication.exe.config的XML檔案來控制它。所所有的配置資訊包含在一個configuration節點中:

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

</configuration>

 

.Net架構使用預定義的關鍵字來控制架構中一些類的行為。另外,你可以定義你自己的配置關鍵字和值。

你可以組合輸出開關和Trace.WriteLineIf()方法來控制應用程式的輸出。你可以在應用程式外以預設的方式關閉這個輸出,以便應用程式得到最好的效能。當發現問題時,你可以開啟這個輸出用於診斷和修正在實際中遇到的問題。WriteLineIf()只有在運算式為真時才輸出:

 

bool _printDiagnostics = true;
Trace.WriteLineIf( _printDiagnostics,
"Printing Diagnostics Today", "MySubSystem" );

 

你所建立的輸出開關用於控制輸出的層級,一個輸出開關可以是由應用程式設定檔定義的變數,可以是五種狀態之一:關閉(Off),錯誤(Error),警告(Warning),資訊(Info)和詳細(Verbose)。這些狀態是環境的一部份,而且它們的值可以是從0到4。這樣你就可能為所有的子系統資訊建立一個控制。 定義一個輸出開關類然後初始化它就可以建立一個開關了:

 

static private TraceSwitch librarySwitch = new
TraceSwitch( "MyAssembly",
"The switch for this assembly" );

 

第一個參數是開關顯示的名字,第二個參數是描述。這樣,在運行時可以在應用程式設定檔中配置它們的值。下面就把librarySwitch設定成Info:

 

<system.diagnostics>
<switches>
    <add name="MyAssembly" value="3" />
</switches>
</system.diagnostics>

 

如果你編輯了這個設定檔中開關的值,那麼就修改了所有由那個開關控制的輸出語句。

另一個任務:你須要配置你的輸出到什麼地方去。 預設是一個連結到Trace類上的監聽者:一個DefaultTraceListener對象。DefaultTraceListener發送資訊到調試器,而且在它的失敗方法(宣告失敗時調用)會列印一些診斷資訊然後終止程式。在產品發布環境中,你不可能看到這樣的資訊。但你可是以配置不同的監聽對象到產品發布環境中:那就是在應用程式的設定檔中添加監聽者。下面就添加了一個TextWriterTraceListener 到應用程式中:

 

<system.diagnostics>
<trace autoflush="true" indentsize="0">
    <listeners>
      <add name="MyListener"
        type="System.Diagnostics.TextWriterTraceListener"
        initializeData="MyListener.log"/>
    </listeners>
</trace>
</system.diagnostics>

 

TextWriterTraceListener把所有的診斷資訊到列印到一個MyListener.log檔案中。名字屬性指定了監聽者的名字,類型指定了作者監聽對象的類型,它必須是從System.Diagnostics.TraceListener派生下來的。只有在極少數情況下你才建立自己的監聽類,那就是你覺得.Net架構的監聽類不夠用。initializeData的值是一個字串,用於傳給對象的建構函式。而TextWriterTraceListeners把它用於檔案名稱。

你可以小做一個擴充,讓它可以在應用中每個部署的程式集上都可以簡單的使用。對於每個程式集,添加一個類來跟蹤程式集建立的診斷:

 

internal class MyAssemblyDiagnostics
{
static private TraceSwitch myAssemblySwitch =
    new TraceSwitch( "MyAssembly",
    "The switch for this assembly" );

internal static void Msg( TraceLevel l, object o )
{
    Trace.WriteLineIf( myAssemblySwitch.Level >= l,
      o, "MyAssembly" );
}

internal static void Msg( TraceLevel l, string s )
{
    Trace.WriteLineIf( myAssemblySwitch.Level >= l,
      s, "MyAssembly" );
}

// Add additional output methods to suit.
}

 

MyAssemblyDiagnostices類根據一個開關來為這個程式集建立診斷資訊。為了建立資訊,調用按常規調用重載的Msg的任何一個就行了:

 

public void Method1( )
{
MyAssemblyDiagnostics.Msg( TraceLevel.Info,
    "Entering Method1." );

bool rVal = DoMoreWork( );

if( rVal == false )
{
    MyAssemblyDiagnostics.Msg( TraceLevel.Warning,
      "DoMoreWork Failed in Method1" );
}

MyAssemblyDiagnostics.Msg( TraceLevel.Info,
    "Exiting Method1." );
}

 

利用一個全域的開關,你還可以組件特殊的程式集開關,來控制整個應用程式的輸出:

 

internal static void Msg( TraceLevel l, object o )
{
Trace.WriteLineIf ( librarySwitch.Level >= l ||
    globalSwitch.Level >= l,
    o, "MyLibrary" );
}

internal static void Msg( TraceLevel l, string s )
{
Trace.WriteLineIf( librarySwitch.Level >= l ||
    globalSwitch.Level >= l,
    s, "MyLibrary" );
}

 

這樣,你就可以在應用程式上診斷資訊,而且更友好的控制個別庫檔案的輸出。在應用程式的任何地方,你都可以設定應用程式級的診斷到錯誤級,從而發現錯誤。當你有一個獨立的問題時,你可以通過提高這個庫的輸出層級,從而精確的發現問題的源頭。

診斷程式庫對診斷和維護已經分發的程式來說是必要的。最好不要寫自己的診斷庫:.Net FCL已經擁有了我們需要的核心功能。應該物盡其用,然後根據自己的目的對它進行擴充。這樣就會捕獲所有問題,即使是在產品環境。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.