#眉標=.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
---------程式-----------