Przekierowanie wyjścia śledzenia do konsoli

Powiedzmy, że pracuję nad małą konsolową aplikacją do przetwarzania wsadowego w VB.Net. chcę być w stanie zorganizować aplikację w ten sposób:

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

Zauważ, że używam Trace zamiast Console do mojego wyjścia. Dzieje się tak dlatego, że metoda worker może być wywoływana z innego miejsca, a nawet żyć w innym zespole i chcę być w stanie dołączyć do niej różne słuchacze śledzenia. Jak Mogę podłączyć konsolę do śledzenia?

Mogę już to zrobić definiując prostą klasę (pokazaną poniżej) i dodanie instancji do kolekcji słuchaczy Trace ' a, ale zastanawiam się, czy istnieje bardziej zaakceptowany lub zbudowany sposób, aby to osiągnąć:

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

Możesz dodać następujące do swojego exe .plik konfiguracyjny.

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

Dodałem również tekst, na wypadek gdybyś był zainteresowany zalogowaniem się do pliku.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-13 17:21:45

Joel,

Możesz to zrobić zamiast metody konfiguracji aplikacji:

Trace.Listeners.Add(new ConsoleTraceListener());
[2]} lub to, jeśli chcesz zarządzać dodawaniem lub usuwaniem słuchacza podczas życia aplikacji:
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/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-23 15:35:09

Świetne rozwiązanie, ale mam sytuację, w której różne biblioteki dll są uruchamiane przez ten sam wywołujący exe, więc nie chcę modyfikować wywołujących exe .plik konfiguracyjny. Chcę, aby każda dll zajmowała się własną zmianą wyjścia śledzenia.

Easy enough:

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

Spowoduje to, oczywiście, wyjście Trace output do " output.txt " plik.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-14 14:59:16