2009-10-21 10 views
5

Ich möchte, dass meine Anwendung verschiedene Ablaufverfolgungsdateien wie MachineName_UserName_yyyymmdd_hhmmss.txt schreiben, wobei der Benutzername der aktuell angemeldete Benutzer ist und die Uhrzeit die Startzeit der Anwendung ist. Der .Net-Listener TextWriterTraceListener scheint nur einen fest codierten Dateinamen zu unterstützen, der in der Konfigurationsdatei angegeben ist. Gibt es eine Möglichkeit, dies zu tun, ohne einen benutzerdefinierten Ablaufverfolgungslistener zu schreiben..Net Benutzerdefinierte Trace-Dateiname

Angenommen, ich habe einen eigenen Spur Zuhörer zu schreiben, habe ich eine Tracelistener wie diese umgesetzt haben:

Imports System.Diagnostics 

Public Class MyCustomTraceListener 
    Inherits TextWriterTraceListener 

    Public Sub New() 
     'Need to do it this way as the Base constructor call has to be the first statement 
     MyBase.New(String.Format("AppNameTraceFile_{0}_{1}_{2}{3}{4}-{5}{6}{7}.txt", _ 
                 Environment.MachineName, _ 
                 Environment.UserName, _ 
                 DateTime.Now.ToString("yyyy"), _ 
                 DateTime.Now.ToString("MM"), _ 
                 DateTime.Now.ToString("dd"), _ 
                 DateTime.Now.ToString("HH"), _ 
                 DateTime.Now.ToString("mm"), _ 
                 DateTime.Now.ToString("ss"))) 
     Me.IndentSize = 4 
    End Sub 

End Class 

In der Konfigurationsdatei habe ich die Trace-Quelle wie folgt konfiguriert:

<system.diagnostics> 
    <trace autoflush="true"/> 
    <sources> 
     <source name="MyTraceSource" 
       switchName="mySwitch" 
       switchType="System.Diagnostics.SourceSwitch" > 
     <listeners> 
      <clear/> 
      <add name="MyTraceListener" 
      type="MyNameSpace.MyCustomTraceListener" 
      traceOutputOptions="ProcessId, DateTime, Callstack" /> 
     </listeners> 
     </source> 
    </sources> 
    <switches> 
     <add name="mySwitch" value="Warning" /> 
    </switches> 
    </system.diagnostics> 

Ich erstelle die Ablaufverfolgungsquelle wie folgt:

Allerdings, beim Start, bekomme ich immer ein Fehler, dass der Typ "MyNameSpace.MycustomTraceListener" nicht gefunden wurde.

Kann jemand sehen, was das Problem hier ist?

Danke.

Antwort

1

Müssen Sie Ihre Typbaugruppe nicht informieren?

<add name="MyTraceListener" 
    type="MyNameSpace.MyCustomTraceListener, MyAssembly" 
    traceOutputOptions="ProcessId, DateTime, Callstack" /> 
+0

Dies funktioniert. Vielen Dank. – DevByDefault

0

Ein weiterer Ansatz, der die Notwendigkeit einer abgeleiteten Klasse völlig vermeidet:

Erstellen Sie eine Basisklasse Textwritertracelistener in der Config xml, und dann beim Start, können Sie die Hörer Sammlung aufzählen, es zu finden (es wird normalerweise ein DefaultTraceListener und ein TextWriterTraceListener), dann setze einfach seinen Logging-Stream auf einen neuen Stream.

+0

Dieser Ansatz funktioniert auch. Vielen Dank. – DevByDefault

0

Was ist mit der Einrichtung Ihres TraceListener im Code? Wenn Sie immer noch bestimmte Parameter wünschen, z.B. log path, um in der app.config zu sein, definiere sie im Abschnitt appSettings und lies sie, wenn du deinen Listener erstellst.

' VB 
Dim traceLog As New FileStream(traceFile, FileMode.OpenOrCreate) 
Dim traceListener As New TextWriterTraceListener(traceLog) 
Trace.Listeners.Add(traceListener) 

// C# 
FileStream traceLog = new FileStream(traceFile, FileMode.OpenOrCreate); 
TextWriterTraceListener traceListener = new TextWriterTraceListener(traceLog); 
Trace.Listeners.Add(traceListener); 

Jedes Element in der Konfiguration entspricht der API, so dass Sie alles tun können, was Sie brauchen.

traceListener.TraceOutputOptions |= TraceOptions.Callstack | TraceOptions.DateTime | TraceOptions.ProcessId; 
+0

Ja, das würde funktionieren, aber ich würde lieber mit allen Konfigurationsmöglichkeiten gehen, die durch die Konfigurationsdatei zur Verfügung gestellt werden, anstatt die Appsettings nach Hause zu backen, um die gleichen Einstellungen nachzuahmen und sie dann programmatisch einzustellen.Config-Datei ist definitiv mehr "der Standard" Weg, es zu tun. Aber ich stimme zu, dass dies eine praktikable Option ist. Vielen Dank. – DevByDefault

0

Der kleine alte Post, aber nur für den Fall jemand kommt über - hier ist ein Link, der beschreibt, wie einen Roll Flat-File-Trace-Listener mit Datum einzustellen und Zeit: http://msdn.microsoft.com/en-us/library/ff664768%28v=pandp.50%29.aspx

Eltern Artikel über Application Block Logging bei http://msdn.microsoft.com/en-us/library/ff664569%28v=pandp.50%29.aspx

Sie müssen ein kostenlos in in Visual Studio Enterprise Library genannt nuget Paket - Logging Application Block

Wenn Sie tief in den Logging Application Block der Enterprise Library eintauchen möchten, hier ist das gesamte PDF-Buch: http://www.microsoft.com/en-us/download/details.aspx?id=41145

Verwandte Themen