2008-10-13 8 views
63

Supposons que je travaille sur une petite application de console de traitement par lots dans VB.Net. Je veux être en mesure de structurer l'application comme ceci:Rediriger la sortie Trace vers la console

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. C'est parce que la méthode de travail peut être appelée d'ailleurs, ou même vivre dans un assemblage différent, et je veux pouvoir attacher différents écouteurs de trace à cela. Alors, comment puis-je connecter la console à la trace?

Je peux déjà le faire en définissant une classe simple (illustré ci-dessous) et en ajoutant une instance à la collection des auditeurs de la trace, mais je me demande s'il y a un plus accepté ou construit de façon d'y arriver:

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 

Répondre

134

Vous pouvez ajouter ce qui suit au fichier .config de votre exe. J'ai aussi inclus TextWriter, au cas où vous souhaiteriez vous connecter à un fichier.

+2

Vous m'avez redirigé vers System.Diagnostics.ConsoleTraceListner. Je l'avais manqué d'une façon ou d'une autre. Je n'ai pas d'app.config par ailleurs, mais je peux le configurer assez facilement à la place. –

+1

Cela fonctionne très bien pour .exe qui ont config, mais j'ai une situation similaire, mais avec une DLL. Je ne veux pas modifier le fichier .config de l'exe appelant (c'est nunit-console.exe). Je vais continuer à regarder, mais je vous ai quand même lancé un vote, car j'ai certainement appris quelque chose. –

10

Excellente solution, mais j'ai une situation où j'ai dll différents étant exécuté par le même exe appelant, donc je ne veux 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); 

Ce sera, bien sûr, la sortie de sortie de trace dans le fichier "output.txt".

+0

Je sais que c'est un vieux post. Mais j'ai un problème avec ça. Pouvez-vous s'il vous plaît regarder mon poste: http://stackoverflow.com/questions/5568630/problem-redirecting-debug-output-to-a-file-using-trace-listener. Je fais la même chose mais avec Debug, et je n'obtiens aucun résultat, c'est-à-dire que le fichier de sortie est vide. Des idées? – TheBoyan

37

Joel,

Vous pouvez le faire au lieu de la méthode de configuration de l'application:

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

ou cela, si vous souhaitez gérer l'ajout ou la suppression de l'auditeur pendant la durée de l'application:

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

Trace.WriteLine("Howdy"); 

Trace.Listeners.Remove(listener); 

Trace.Close(); 
Questions connexes