2012-02-01 41 views
1

WriteEntry与Writeline具有完全不同的签名。还有一个My.Application.Log.WriteException()。当我以编程方式添加侦听器时,WriteEntry不起作用。My.Application.Log.WriteEntry()如何与System.Diagnostics.Trace.WriteLine()相关联

Trace.Listeners.Add(New Logging.FileLogTraceListener("stuff") With { _ 
          .Append = False, _ 
          .AutoFlush = True, _ 
          .DiskSpaceExhaustedBehavior = Logging.DiskSpaceExhaustedOption.DiscardMessages, _ 
          .Location = Logging.LogFileLocation.ExecutableDirectory, _ 
          .TraceOutputOptions = TraceOptions.DateTime, _ 
          .BaseFileName = GetExecutingAssembly.GetName.Name & "_" & Date.Now.ToString(ISO_LogFileNameFormat)}) 

有人可以解释这些函数之间的关系吗?

回答

2

要知道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") 
+0

我刚看源(我用ILSpy),然后它是有道理的。 WriteEntry使用TraceEvent,但Trace.WriteLine更简单,并直接写入输出。 – jimconstable 2012-02-04 00:42:24