Redirigir la salida de seguimiento a la consola


Digamos que estoy trabajando en una pequeña aplicación de consola de procesamiento por lotes en VB.Net. Quiero ser capaz de estructurar la aplicación de esta manera:

Sub WorkerMethod()
   'Do some work
   Trace.WriteLine("Work progress")

   'Do more work
   Trace.WriteLine("Another progress update")

   '...
End Sub


Sub Main()

   'Do any setup, like confirm the user wants to continue or whatever

   WorkerMethod()     

End Sub

Tenga en cuenta que estoy usando Trace en lugar de Console para mi salida. Esto se debe a que el método worker puede ser llamado desde otro lugar, o incluso vivir en un ensamblaje diferente, y quiero ser capaz de adjuntar diferentes oyentes de seguimiento a él. Entonces, ¿cómo puedo conectar la consola al trace?

Ya puedo hacerlo definiendo una clase simple (mostrada a continuación) y añadiendo una instancia a la colección de oyentes de Trace, pero me pregunto si hay una forma más aceptada o construida para lograr esto:

Public Class ConsoleTrace
    Inherits Diagnostics.TraceListener

    Public Overloads Overrides Sub Write(ByVal message As String)
        Console.Write(message)
    End Sub

    Public Overloads Overrides Sub WriteLine(ByVal message As String)
        Console.WriteLine(message)
    End Sub
End Class
Author: Joel Coehoorn, 2008-10-13

3 answers

Puede agregar lo siguiente a su exe .archivo de configuración.

<?xml version="1.0"?>
<configuration>
    <system.diagnostics>
        <trace autoflush="true">
            <listeners>
                <add name="logListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="cat.log" />
                <add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener"/>
            </listeners>
        </trace>
    </system.diagnostics>
</configuration>

También incluí al redactor de textos, en caso de que esté interesado en iniciar sesión en un archivo.

 140
Author: harpo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-13 17:21:45

Joel,

Puedes hacer esto en lugar del método de configuración de la aplicación:

Trace.Listeners.Add(new ConsoleTraceListener());

O esto, si desea administrar la adición o eliminación del oyente durante la vida útil de la aplicación:

ConsoleTraceListener listener = new ConsoleTraceListener();
Trace.Listeners.Add(listener);

Trace.WriteLine("Howdy");

Trace.Listeners.Remove(listener);

Trace.Close();
 44
Author: Scott P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-23 15:35:09

Gran solución, pero tengo una situación en la que tengo diferentes dll que se ejecutan por el mismo exe de llamada, por lo que no quiero modificar los exe de llamada .archivo de configuración. Quiero que cada dll maneje su propia alteración de la salida de rastreo.

Bastante fácil:

Stream outResultsFile = File.Create ("output.txt");
var textListener = new TextWriterTraceListener (outResultsFile);
Trace.Listeners.Add (textListener);

Esto, por supuesto, la salida de Trace de salida a la " salida.txt archivo".

 10
Author: Scott Marlowe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-14 14:59:16