Rediriger la sortie de trace vers la console
Question
Supposons que je travaille sur une petite application de console de traitement par lots dans VB.Net. Je veux pouvoir structurer l'application de la manière suivante:
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
Notez que j'utilise Trace
plutôt que Console
pour ma sortie. En effet, la méthode de travail peut être appelée ailleurs ou même habiter dans un assembly différent et je souhaite pouvoir y attacher différents écouteurs de trace. Alors, comment puis-je connecter la console à la trace?
Je peux déjà le faire en définissant une classe simple (voir ci-dessous) et en ajoutant une instance à la collection d'écouteurs de Trace, mais je me demande s'il existe un moyen plus accepté ou intégré permettant d'accomplir cela:
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
La solution
Vous pouvez ajouter ce qui suit au fichier .config de votre exe.
<?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>
J'ai également inclus TextWriter, au cas où vous souhaiteriez vous connecter à un fichier.
Autres conseils
Joel,
Vous pouvez le faire à la place de la méthode de configuration d'application:
Trace.Listeners.Add(new ConsoleTraceListener());
ou ceci, si vous souhaitez gérer l'ajout ou la suppression de l'écouteur pendant la durée de vie de l'application:
ConsoleTraceListener listener = new ConsoleTraceListener();
Trace.Listeners.Add(listener);
Trace.WriteLine("Howdy");
Trace.Listeners.Remove(listener);
Trace.Close();
Excellente solution, mais dans certaines situations, différentes dll sont gérées par le même exe appelant. Par conséquent, je ne souhaite pas modifier le fichier .config de l'exe appelant. Je veux que chaque dll gère sa propre modification de la sortie de trace.
Assez facile:
Stream outResultsFile = File.Create ("output.txt");
var textListener = new TextWriterTraceListener (outResultsFile);
Trace.Listeners.Add (textListener);
Ceci produira bien sûr la sortie de la trace dans le fichier "output.txt". fichier.