Trace.Listeners和Debug.Listeners共享相同的內部集合,因此我無法向Trace.Listeners添加一個跟蹤偵聽器,也無法向Debug.Listeners添加一個調試偵聽器來區分它們。如何區分自定義跟蹤偵聽器中的跟蹤調試和調試?
我該如何做到這一點?
編輯:
爲什麼我要做到這一點很簡單,因爲我wrting一個記錄層,我們的應用程序,我想通過跟蹤不同的日誌出來的系統中調試/跟蹤是兩個來源日誌(還有一些其他來源)我想跟蹤。
Trace.Listeners和Debug.Listeners共享相同的內部集合,因此我無法向Trace.Listeners添加一個跟蹤偵聽器,也無法向Debug.Listeners添加一個調試偵聽器來區分它們。如何區分自定義跟蹤偵聽器中的跟蹤調試和調試?
我該如何做到這一點?
編輯:
爲什麼我要做到這一點很簡單,因爲我wrting一個記錄層,我們的應用程序,我想通過跟蹤不同的日誌出來的系統中調試/跟蹤是兩個來源日誌(還有一些其他來源)我想跟蹤。
[編輯]
我錯過了問題的標題部分,你提到這在一個自定義跟蹤監聽器的情況下。所以,顯然你寫了(或者想寫)一個可以區分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在此示例中的好處是什麼?
在你的app.config,你可以打開「MyClass的」 TraceSource或關閉,或將其設置到一定水平。如果將其設置爲「調試」,則將編寫調試和信息消息。如果您將其設置爲「信息」,則只會記錄信息信息。如果設置的值高於「信息」,則不會記錄該示例中的任何消息。
在您的app.config中,您可以將「MyClass」的輸出發送到一個或多個TraceListeners。如果你有更多的TraceSources(「YourClass」,「HisClass」),每個可以到同一個TraceListener或者每個TraceListener或者它們之間的任何組合。
在您的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。*來爲您的代碼添加跟蹤/日誌記錄,那麼您會更好。
祝你好運!
你想完成什麼?你可以展示一些你想寫的代碼,也許你想要的結果是什麼?可能有不同的方式來完成你想要的,而不是你可能想到的。 – wageoghe 2011-01-14 18:53:06
其非常簡單,我想記錄一切到我的自定義聽衆。在一箇中調試呼叫和在一箇中調用呼叫。 – Marcus 2011-01-15 10:43:05