Leiten Sie die Trace-Ausgabe zur Konsole um

74

Angenommen, ich arbeite an einer kleinen Konsolen-App für die Stapelverarbeitung in VB.Net. Ich möchte die App folgendermaßen strukturieren können:

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

Beachten Sie, dass ich Tracenicht Consolefür meine Ausgabe verwende. Dies liegt daran, dass die Worker-Methode möglicherweise von einer anderen Stelle aufgerufen wird oder sogar in einer anderen Assembly lebt, und ich möchte in der Lage sein, verschiedene Trace-Listener daran anzuhängen. Wie kann ich die Konsole mit dem Trace verbinden?

Ich kann dies bereits tun, indem ich eine einfache Klasse definiere (siehe unten) und der Listener-Sammlung des Trace eine Instanz hinzufüge, aber ich frage mich, ob es eine akzeptierte oder eingebaute Methode gibt, um dies zu erreichen:

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
Joel Coehoorn
quelle

Antworten:

157

Sie können der .config-Datei Ihrer Exe Folgendes hinzufügen.

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

Ich habe auch den TextWriter hinzugefügt, falls Sie sich in einer Datei anmelden möchten.

Harpo
quelle
2
Upvote für den Hinweis auf System.Diagnostics.ConsoleTraceListner. Das hatte ich irgendwie verpasst. Ich habe sonst keine app.config, aber ich kann diese stattdessen einfach genug im Code einrichten.
Joel Coehoorn
1
Das funktioniert gut für EXE-Dateien mit Konfigurationen, aber ich habe eine ähnliche Situation, aber mit einer DLL. Ich möchte die .config-Datei der aufrufenden Exe nicht ändern (es ist nunit-console.exe). Ich werde weiter suchen, habe dir aber trotzdem eine Stimme gegeben, da ich auf jeden Fall etwas gelernt habe.
Scott Marlowe
55

Joel,

Sie können dies anstelle der App-Konfigurationsmethode tun:

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

oder dies, wenn Sie das Hinzufügen oder Entfernen des Listeners während der Lebensdauer der App verwalten möchten:

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

Trace.WriteLine("Howdy");

Trace.Listeners.Remove(listener);

Trace.Close();
Scott P.
quelle
11

Tolle Lösung, aber ich habe eine Situation, in der verschiedene DLLs von derselben aufrufenden Exe ausgeführt werden, sodass ich die .config-Datei der aufrufenden Exe nicht ändern möchte. Ich möchte, dass jede DLL ihre eigene Änderung der Trace-Ausgabe übernimmt.

Leicht genug:

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

Dadurch wird natürlich die Trace-Ausgabe in die Datei "output.txt" ausgegeben.

Scott Marlowe
quelle
Ich weiß, dass dies ein alter Beitrag ist. Aber ich habe ein Problem damit. Können Sie sich bitte meinen Beitrag ansehen : stackoverflow.com/questions/5568630/… . Ich mache das gleiche, aber mit Debug, und ich erhalte keine Ergebnisse, dh die Ausgabedatei ist leer. Irgendwelche Ideen?
TheBoyan