[C#.Net] 追蹤類別 - TraceSource
上篇有提到使用Debug/Trace類別輸出追蹤結果,但這訊息有點稍嫌不足,我們這次將使用TraceSource類別來追蹤比較詳細的訊息。使用TraceSource類別需要有幾個步驟:
- 定義SourceSwitch類別
- 定義TraceSource類別
- 定義TraceListener類別
SourceSwitch 類別 - 這是用來決定輸出類型,SourceSwitch.Level = SourceLevels 列舉型別,設定要顯示的類型,這有點類似過濾的意思;若要過濾更多的訊息必須要使用TraceFilter類別。
TraceSource 類別 - 用來追蹤來源。以下方法是將資料寫入Listeners 集合,這就跟Trace/Debug類別的Wrtie方法一樣,只不過TraceSource可以包含更多的分類。
TraceListener 抽象類別 - 這是用來接聽追蹤類別的輸出訊息,繼承它的類別有以下:
- DefaultTraceListener - 輸出至VS開發工具的輸出視窗。
- EventLogTraceListener - 輸出至事件日誌。
- TextWriterTraceListener - 輸出至TextWriter或Stream類別
- DelimitedListTraceListener - 輸出至有分格符號文字檔
- XmlWriterTraceListener - 輸出至XML文字檔
TraceListener 抽象類別中的TraceOutputOptions 屬性是用來決定要輸出的格式內容,只要傳入TraceOptions 列舉型別就可以了
範例如下
private void Form1_Load(object sender, EventArgs e)
{
TextWriterTraceListener listen = new TextWriterTraceListener("traceLog");
listen.TraceOutputOptions = TraceOptions.ProcessId |
TraceOptions.ThreadId |
TraceOptions.Timestamp |
TraceOptions.DateTime |
TraceOptions.LogicalOperationStack |
TraceOptions.Callstack;
Trace.Listeners.Add(listen);
Trace.AutoFlush = true;
Trace.WriteLine("Test");
SourceSwitch sourceSwitch = new SourceSwitch("sourceSwitch");
sourceSwitch.Level = SourceLevels.Verbose;
TraceSource traceSource = new TraceSource("traceSource");
traceSource.Switch = sourceSwitch;
traceSource.Listeners.Add(listen);
traceSource.TraceEvent(TraceEventType.Error, 1, "Error");
traceSource.TraceEvent(TraceEventType.Information, 1, "Information");
}
觀察輸出結果
如此一來我們就完成了追蹤的功能。
同樣的上述的功能我們也可以透過組態檔完成,在App.config加入以下
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<trace autoflush="true"></trace>
<sources>
<source name="traceSource" switchName="sourceSwitch" switchType=" System.Diagnostics.SourceSwitch" >
<listeners>
<add name="myListener"></add>
</listeners>
</source>
</sources>
<switches>
<add name="sourceSwitch" value="Verbose"></add>
</switches>
<sharedListeners>
<add name="myListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="d:\testLog.log"
traceOutputOptions="DateTime,ProcessId,Timestamp,ThreadId"></add>
</sharedListeners>
</system.diagnostics>
</configuration>
接著在程式裡呼叫組態檔"traceSource",這樣也是可以完成追蹤。
private void Form1_Load(object sender, EventArgs e)
{
TraceSource traceSource = new TraceSource("traceSource");
traceSource.TraceEvent(TraceEventType.Error, 1, "Error");
traceSource.TraceEvent(TraceEventType.Information, 1, "Information");
}

若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET