2009-10-21 16 views
5

Me gustaría que mi aplicación escriba diferentes archivos de rastreo nombrados como MachineName_UserName_aaaammdd_hhmmss.txt donde el nombre de usuario es el usuario actualmente conectado y la hora es la hora de inicio de la aplicación. El oyente .Net TextWriterTraceListener solo parece soportar un nombre de archivo codificado duro especificado en el archivo de configuración. ¿Hay alguna manera de hacer esto sin escribir un escucha de seguimiento personalizado?.Net Custom Trace file name

Suponiendo que tengo que escribir un oyente de seguimiento personalizado, he implementado un TraceListener así:

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 

En el archivo de configuración, he configurado el origen de seguimiento de esta manera:

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

Estoy creando la fuente de seguimiento como lo siguiente:

Dim tsTraceSource As TraceSource = New TraceSource("MyTraceSource") 
tsTraceSource.TraceEvent(TraceEventType.Warning, 0, "warning message") 

Sin embargo, al inicio, sigo recibiendo un error que no se pudo encontrar el tipo "MyNameSpace.MycustomTraceListener".

¿Alguien ve cuál es el problema aquí?

Gracias.

Respuesta

1

¿No necesita informar a su tipo de montaje?

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

Esto funciona. Gracias. – DevByDefault

0

Otro método que evita la necesidad de una clase derivada del todo:

Crear una TextWriterTraceListener clase base en su xml de configuración, y luego en el arranque, se puede enumerar la colección Listeners para encontrarlo (habrá usualmente es un DefaultTraceListener y un TextWriterTraceListener), luego simplemente configure su secuencia de registro a una nueva transmisión.

+0

Este enfoque también funciona. Gracias. – DevByDefault

0

¿Qué hay de configurar su TraceListener en el código? Si aún desea ciertos parámetros, p. log path, para estar en app.config, defínalos en la sección appSettings y léelos cuando cree su listener.

' 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); 

Cada elemento en la configuración corresponde a la API, por lo que podrás hacer todo lo que necesites.

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

Sí, esto funcionaría, pero preferiría ir con todas las capacidades de configuración proporcionadas a través del archivo de configuración en lugar de hacerlo en casa hornear las aplicaciones para imitar la misma configuración y luego configurarlas programáticamente.El archivo de configuración es definitivamente una forma más "estándar" de hacerlo. Pero, estoy de acuerdo en que esta es una opción viable. Gracias. – DevByDefault

0

pequeño post viejo, pero por si acaso alguien se encuentra con - aquí hay un enlace que detalla cómo configurar una escucha de seguimiento de archivo plano de rodadura con fecha y hora: http://msdn.microsoft.com/en-us/library/ff664768%28v=pandp.50%29.aspx

artículo Padres acerca del registro de aplicación del bloque se realiza bajo http://msdn.microsoft.com/en-us/library/ff664569%28v=pandp.50%29.aspx

Puede que tenga que añadir un Nuget envasan en Visual Studio Enterprise Library llama - Logging Application Block

En caso de que desee profundizar en el Bloque de aplicaciones de registro de la Biblioteca de empresa, aquí está todo el libro en PDF en él: http://www.microsoft.com/en-us/download/details.aspx?id=41145