2009-07-23 23 views
14

Estoy usando TextWriterTraceListener para registrar mensajes de diagnóstico en un archivo de texto. Sin embargo, también quiero registrar una marca de tiempo de cada mensaje de rastreo agregado. ¿Es posible definir un tipo de formateador para el oyente que agregará marcas de tiempo automáticamente?Formateo de salida de rastreo

Actualmente estoy agregando marcas de tiempo manualmente en cada llamada Trace.WriteLine(), pero esto no es muy cómodo.

Respuesta

15

En su lugar, le sugiero que utilice Log4Net, que tiene mucha más personalización.

Como alternativa, puede escribir su propia implementación TraceListener que le indique las marcas de tiempo. Usted puede incluso ser capaz simplemente derivar de TextWriterTraceListener y anular Write y WriteLine:

public override void Write(string x) 
{ 
    // Use whatever format you want here... 
    base.Write(string.Format("{0:r}: {1}", DateTime.UtcNow, x)); 
} 

public override void WriteLine(string x) 
{ 
    // Use whatever format you want here... 
    base.WriteLine(string.Format("{0:r}: {1}", DateTime.UtcNow, x)); 
} 
1

Usted puede escribir su propia subclase TextWriterTraceListener que anula los métodos WriteLine, decora la línea, y luego pasa la cadena de decoración a la base implementación de clase para hacer la salida real.

-1

Realmente no es una respuesta a su pregunta, pero ¿ha considerado usar log4Net?

Puede configurarlo para agregar tiempos, etc., junto con una gran cantidad de otras funcionalidades útiles.

1

O simplemente añadir "DateTime" como traceOutputOption.

+4

como está escrito en http://msdn.microsoft.com/en-us/library/system.diagnostics.tracelistener.traceoutputoptions.aspx este parámetro no es utilizado por 'Write' y' métodos WriteLine' de ' TextWriterTraceListener' que lo hace inútil en mi caso – RaYell

0

Aunque esto es antiguo y se ha aceptado una respuesta, incluiré una opción más. Puede usar el complemento Ukadc.Diagnostics de codeplex. Entre otras cosas, le permite definir un formato personalizado, similar al formato que puede definir con log4net y NLog. Es una dependencia de solo configuración. Es decir, configura el uso de Ukadc.Diagnostics a través del archivo app.config. No hay dependencias de origen (continúa registrándose a través de System.Diagnostics no a través de una API especial). Una vez dicho esto, hay algunas limitaciones que debe tener en cuenta:

  1. Las opciones de formato actualmente implementados en Ukadc.Diagnostics realmente sólo funcionan correctamente cuando se conecta con TraceSources. Al iniciar sesión con Trace.Write y Trace.WriteLine, el objeto TraceEventCache no se rellena y es allí donde la mayoría de los objetos de formato obtienen su información.

  2. Debe usar un Ukadc.Diagnostics TraceListener (o un oyente personalizado derivado de Ukadc.Diagnostics base TraceListener) para obtener el formato personalizado para que aparezca en su salida. Si encontraste un nuevo archivo superdirectorio TraceListener, tendrás que trabajar un poco para usarlo junto con el formato Ukadc.Diagnostics. Esto podría ser tan difícil como volver a implementar al oyente en términos de Ukadc.Diagnostics base TraceListener. O podría ser más fácil, si pudiera simplemente crear un nuevo TraceListener basado en los diagnósticos de Ukadc que contenga el Super Trazador rodante TraceListener, formatee los mensajes por Ukadc.Diagnostics y luego delegue en los métodos Write/WriteLine del oyente contenido.

12

Recientemente me encontré situación similar y parece que ahora tenemos una herramienta muy apto para la tarea, a saber Essential Diagnostics. Configure un oyente en app.config como en el código a continuación y simplemente coloque Essential.Diagnostics.dll en la misma carpeta.NO SE REQUIERE RECOMPILLO. Puede usarlo con cualquier aplicación que use System.Diagnostics para rastrear, incluso si no posee la fuente. ¿No es maravilloso?

<sharedListeners> 
    <add name="rollingfile" 
    type="Essential.Diagnostics.RollingFileTraceListener, Essential.Diagnostics" 
    initializeData="{ApplicationName}-{DateTime:yyyy-MM-dd}.log" 
    convertWriteToEvent="true" 
    template="{DateTime:yyyy-MM-dd HH:mm:ss.fff} {Message}{Data}" 
    /> 
</sharedListeners> 
+0

La forma más fácil de instalar esto es a través de NuGet: Install-Package Essential.Diagnostics.RollingFileTraceListener (Nota: yo soy el mantenedor de Essential.Diagnostics) –

+0

Además, pensé que señalaría la configuración "convertWriteToEvent" convertirá Write y WriteLine para rastrear eventos, por lo que también obtendrán una marca de tiempo. (Aunque probablemente sea mejor usar TraceSource en lugar de los métodos estáticos en Trace). –

+0

Essential Diagnostics se ha movido de codeplex a github. Actualizar enlace por favor: https://github.com/sgryphon/essential-diagnostics – dimaaan