#眉標=.NET #副標=.NET Namespace專欄 #大標= System.Diagnostics(上)程式監控和測試 #作者=文/彭靖灝 ---------程式----------- Debug.WriteLine(“Hello, world!”) Trace.WriteLine(“Hellp, world!”) ---------程式----------- ---------程式----------- 程式1 Dim myTraceLog As _ New System.IO.FileStream("C:\Temp\myTraceLog.txt", _ IO.FileMode.OpenOrCreate) ' Creates the new trace listener myListener = New TextWriterTraceListener(myTraceLog) ---------程式----------- ---------程式----------- 程式2 myListener.WriteLine(Now.ToLongTimeString & _ " : 開始呼叫授權作業") If Authorize(txtCreditCardNo.Text, _ Decimal.Parse(txtAmount.Text)) Then strresult = "通過!" Else strResult = "拒絕!" End If lblResult.Text = strResult myListener.WriteLine(Now.ToLongTimeString & _ " : 授權作業完成,結果:" & strResult) myListener.Flush() ---------程式----------- ---------程式----------- 程式3 Dim myFile As New _ FileStream("C:\Temp\ConsoleLog.txt", FileMode.OpenOrCreate) Dim myTextListener As _ New TextWriterTraceListener(myFile) Trace.Listeners.Add(myTextListener) Dim myConsoleListener As _ New TextWriterTraceListener(System.Console.Out) Trace.Listeners.Add(myConsoleListener) Trace.WriteLine("追蹤結果輸出至所有Listener") myConsoleListener.WriteLine ("追蹤結果只輸出到命令視窗。") myTextListener.WriteLine ("追蹤結果只輸出到文字檔案。") ' 針對所有追蹤接聽器進行清空 Trace.Flush() ' 針對個別追蹤接聽器進行清空 myConsoleListener.Flush() myTextListener.Flush() ' 以下程式碼相當於執行 myTextListener.Close myTextListener.Close() ---------程式----------- ---------程式----------- 程式4 Dim dbSwitch As New _ BooleanSwitch("DatabaseSwitch", "資料庫存取") Dim apSwitch As New _ TraceSwitch("ApplicationSwitch", "應用程式作業") ---------程式----------- 而在對應的.config檔中(Windows Form的程式是在app.config中指定,Web Form的程式是在web.config中指定)就會指定以下的標註: ---------程式----------- 程式5 ---------程式----------- ---------程式----------- 程式6 Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Dim myTraceLog As New FileStream(_ "C:\Temp\myTraceLog.txt", FileMode.Append) ' Creates the new trace listener myListener = New TextWriterTraceListener(myTraceLog) myListener.WriteLine(Now.ToLongTimeString & _ " : 目前追蹤等級為 " & apSwitch.Level.ToString) End Sub ---------程式----------- ---------程式----------- 程式7 依據等級提供不同追蹤資訊 Private Sub btnAuthorize_Click(ByVal sender As _ System.Object, ByVal e As System.EventArgs) _ Handles btnAuthorize.Click Dim strResult As String If apSwitch.TraceInfo Then myListener.WriteLine(Now.ToLongTimeString & _ " : 開始呼叫授權作業") End If Trace If Authorize(txtCreditCardNo.Text, _ Decimal.Parse(txtAmount.Text)) Then strResult = "通過!" Else strResult = "拒絕!" End If Catch ex As Exception If apSwitch.TraceError Then myListener.WriteLine(Now.ToLongTimeString & _ " : 錯誤─" & ex.Message) End If End Try lblResult.Text = strResult If apSwitch.TraceInfo Then myListener.WriteLine(Now.ToLongTimeString & _ " : 授權作業完成,結果:" & strResult) End If myListener.Flush() End Sub Private Function Authorize(ByVal CreditCardNo As String, _ ByVal Amount As Decimal) As Boolean Dim bResult As Boolean If apSwitch.TraceVerbose Then myListener.WriteLine(Now.ToLongTimeString & _ " : 進行授權作業") End If If CreditCardNo.Substring(0, 1) = "0" And Amount > _ 3000 Then bResult = False Else bResult = True End If If apSwitch.TraceVerbose Then myListener.WriteLine(Now.ToLongTimeString & _ " : 完成授權作業") End If Return bResult End Function Private Sub Form1_Closed(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Closed myListener.Close() End Sub ---------程式----------- ---------程式----------- 程式8 Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Dim myTraceLog As New FileStream("C:\Temp\myTraceLog.txt", _ FileMode.Append) ' Creates the new trace listener myListener = New TextWriterTraceListener(myTraceLog) Trace.Listeners.Add(myListener) Trace.WriteLine(Now.ToLongDateString & "-" & _ Now.ToLongTimeString & " : 程式啟動。") Trace.Indent() Trace.WriteLine(Now.ToLongTimeString & _ " : 目前追蹤等級為 " & apSwitch.Level.ToString) End Sub Private Sub Form1_Closed(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles MyBase.Closed Trace.Unindent() Trace.WriteLine(Now.ToLongTimeString & " : 程式結束") Trace.Close() End Sub ---------程式----------- ---------程式----------- Trace.WriteLineIf(apSwitch.TraceError, _ Now.ToLongTimeString & " : 開始呼叫授權作業") ---------程式----------- 在語法和作業方式上,它會顯得更簡潔,更直覺。 另外如果我們期望每次寫入追蹤訊息後,就直接傳送緩衝區的內容到接聽器中,除了自行控制叫用Flush方法之外,也可以指定Debug或Trace類別的AutoFlush屬性的值為True,讓追蹤器自行處理清除緩衝區的作業。 這些設定的作業除了透過程式控制之外,也可以透過設定檔來控制,下面的設定檔片段就指定縮排的空格數量為3個空白字元,同時關閉自動清除緩衝區的功能: ---------程式----------- 程式9 ---------程式-----------