Как My.Application.Log.WriteEntry () относится к System.Diagnostics.Trace.WriteLine () - PullRequest
1 голос
/ 01 февраля 2012

WriteEntry имеет совершенно другую подпись для Writeline.Там также есть My.Application.Log.WriteException ().Когда я добавляю слушателей программно, WriteEntry не работает.

 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)})

Может кто-нибудь объяснить связь между этими функциями?

1 Ответ

3 голосов
/ 01 февраля 2012

Чтобы узнать разницу между WriteEntry и Writeline, используйте Reflector или ILSpy и просмотрите детали, чтобы увидеть внутреннюю реализацию.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")
...