2011-01-14 87 views
5

Trace.Listeners和Debug.Listeners共享相同的內部集合,因此我無法向Trace.Listeners添加一個跟蹤偵聽器,也無法向Debug.Listeners添加一個調試偵聽器來區分它們。如何區分自定義跟蹤偵聽器中的跟蹤調試和調試?

我該如何做到這一點?

編輯:

爲什麼我要做到這一點很簡單,因爲我wrting一個記錄層,我們的應用程序,我想通過跟蹤不同的日誌出來的系統中調試/跟蹤是兩個來源日誌(還有一些其他來源)我想跟蹤。

+0

你想完成什麼?你可以展示一些你想寫的代碼,也許你想要的結果是什麼?可能有不同的方式來完成你想要的,而不是你可能想到的。 – wageoghe 2011-01-14 18:53:06

+0

其非常簡單,我想記錄一切到我的自定義聽衆。在一箇中調試呼叫和在一箇中調用呼叫。 – Marcus 2011-01-15 10:43:05

回答

4

[編輯]

我錯過了問題的標題部分,你提到這在一個自定義跟蹤監聽器的情況下。所以,顯然你寫了(或者想寫)一個可以區分Trace.WriteLine和Debug.WriteLine的自定義TraceListener。我認爲以下所說的所有內容仍然適用於TraceSources,而不是Trace.WriteLine和Debug.WriteLine。然而,我的答案並不一定回答你的問題,除非說我不認爲從TraceListener的Write和WriteLine方法中可能會因爲調用Trace.WriteLine vs Debug而最終調用它們.WriteLine。

即使您可以從自定義TraceListener中告知Write或WriteLine調用的最終來源,您仍然不清楚要完成什麼。無論您想要完成什麼,我都必須相信,如果您在TraceSources的代碼中將日誌記錄用於開始時,將會更容易。

您可以在原始問題中添加一些代碼,說明如何編寫一些應用程序代碼,並添加對Trace.WriteLine和Debug.WriteLine的一些調用。另外,顯示自定義TraceListener的一些代碼,該代碼顯示如果您可以區分Trace.WriteLine和Debug.WriteLine,您想要執行的操作。喜歡的東西:

public void WriteLine(string msg) 
{ 
    if (WasWrittenFromTrace) 
    { 
    //Before writing to output, add "TRACE" to front of message 
    WriteToOutput("TRACE: {0}", msg); 
    } 
    else 
    if (WasWrittenFromDebug) 
    { 
    //Before writing to output, add "DEBUG" to front of message 
    WriteToOutput("DEBUG: {0}", msg); 
    } 
} 

[編輯完]

this answer我最近張貼在回答關於使用System.Diagnostics程序問題。

那裏有很多信息和答案中有關如何使用System.Diagnostics的鏈接中的很多信息,重點在於使用TraceSources而不是Trace.WriteLine和Debug.WriteLine。

從你的問題,這聽起來像你可能想要寫一些像這樣的代碼:

public void MyFunction(int x, int y) 
{ 
    Trace.WriteLine("Entering MyFunction. x = {0}, y = {1}", x, y); 

    int product = x * y; 

    Debug.WriteLine("product = {0}", product); 

    Trace.WriteLine("Exiting MyFunction"); 
} 

,你會很明顯,如跟蹤輸出去一個的TraceListener和調試輸出到另一個的TraceListener 。或者在TraceListener中(也許你會自己寫),你想知道給定的Write/WriteLine實際上是一個Trace.Write還是一個Debug.Write。我不認爲這是真的可能。

你還想以其他方式控制跟蹤和調試輸出(也許打開一個和一個關閉?

如果你會使用TraceSources,你可以很容易地控制你的跟蹤/日誌記錄的級別,你可以,如果你想這樣做,送一些TraceSources的輸出到一個TraceListener的和其他的輸出到不同TraceListener(和一些TraceSource甚至可以寫入多個TraceListeners)。

因此,使用TraceSources,你可能會寫這樣的代碼:

public class MyClass 
{ 
    //Static variable, so all instances of MyClass will have access to the same instance 
    //of the TraceSource 
    private static readonly TraceSource ts = new TraceSource("MyClass"); 

    public void MyMethod(int x, int y) 
    { 
    ts.TraceEvent(TraceEventType.Information, 0, "Entering MyMethod. x = {0}, y = {1}", x, y); 

    int product = x * y; 

    ts.TraceEvent(TraceEventType.Debug, 0, "Product = {0}", product); 

    ts.TraceEvent(TraceEventType.Information, 0, "Exiting MyMethod."); 
    } 
} 

什麼是TraceSource在此示例中的好處是什麼?

  1. 在你的app.config,你可以打開「MyClass的」 TraceSource或關閉,或將其設置到一定水平。如果將其設置爲「調試」,則將編寫調試和信息消息。如果您將其設置爲「信息」,則只會記錄信息信息。如果設置的值高於「信息」,則不會記錄該示例中的任何消息。

  2. 在您的app.config中,您可以將「MyClass」的輸出發送到一個或多個TraceListeners。如果你有更多的TraceSources(「YourClass」,「HisClass」),每個可以到同一個TraceListener或者每個TraceListener或者它們之間的任何組合。

  3. 在您的app.config中,您可以設置switching和/或filtering,使「MyClass」被指定爲轉到例如兩個TraceListeners。一個TraceListener可以過濾,只記錄「調試」消息,另一個可以過濾,只記錄「信息」消息。

您可以使用TraceSources做更多的事情。閱讀上面的鏈接以及該帖子中的鏈接。請參閱我在帖子中提到的Ukadc.Diagnostics項目。 Essential.Diagnostics是另一個爲System.Diagnostics提供擴展的項目,並展示了使用System.Diagnostics的一些非常好的示例。 Here is a good example from MSDN about using TraceSources, filters, and TraceListeners

在我看來,如果您嘗試使用TraceSources而不是Trace。*和Debug。*來爲您的代碼添加跟蹤/日誌記錄,那麼您會更好。

祝你好運!