要知道WriteEntry和Writeline之间使用Reflector的区别,并深入查看内部实现。该System.Diagnostic.Trace.WriteLine:
Public Shared Sub WriteLine(ByVal value As Object)
If TraceInternal.UseGlobalLock Then
SyncLock TraceInternal.critSec
Dim listener As TraceListener
For Each listener In TraceInternal.Listeners
listener.WriteLine(value)
If TraceInternal.AutoFlush Then
listener.Flush
End If
Next
Return
End SyncLock
End If
Dim listener2 As TraceListener
For Each listener2 In TraceInternal.Listeners
If Not listener2.IsThreadSafe Then
SyncLock listener2
listener2.WriteLine(value)
If TraceInternal.AutoFlush Then
listener2.Flush
End If
Continue For
End SyncLock
End If
listener2.WriteLine(value)
If TraceInternal.AutoFlush Then
listener2.Flush
End If
Next
End Sub
的My.Application.Log.WriteEntry只是一个LOP语法,但其真正指向的命名空间Microsoft.VisualBasic.Logging.Log.WriteEntry:
Public Sub WriteEntry(ByVal message As String, ByVal severity As TraceEventType, ByVal id As Integer)
If (message Is Nothing) Then
message = ""
End If
Me.m_TraceSource.TraceEvent(severity, id, message)
End Sub
要设置它编程,你可以这样做:
Dim listener As New FileLogTraceListener()
listener.Location = LogFileLocation.TempDirectory
listener.BaseFileName = "ConsoleApp_"
listener.Append = True
listener.Delimiter = "|"
listener.AutoFlush = True
虽然在一般你会在配置文件中进行配置:
<system.diagnostics>
<sources>
<source name="TestSrc">
<listeners>
<add name="FileLogger" type="Microsoft.VisualBasic.Logging.FileLogTraceListener,
Microsoft.VisualBasic,Version=8.0.0.0,Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</listeners>
</source>
</sources>
</system.diagnostics>
然后你可以使用它像这样:
Debug.Listeners.Add(listener)
Debug.WriteLine("Testing 1 2 3")
我刚看源(我用ILSpy),然后它是有道理的。 WriteEntry使用TraceEvent,但Trace.WriteLine更简单,并直接写入输出。 – jimconstable 2012-02-04 00:42:24