Dies mag eine Art mehr Arbeit sein, aber ich würde den umgekehrten Weg gehen.
Instanziieren Sie a TraceListener
für die Konsole und eins für die Protokolldatei. Verwenden Trace.Write
Sie danach Anweisungen in Ihrem Code anstelle von Console.Write
. Danach wird es einfacher, das Protokoll oder die Konsolenausgabe zu entfernen oder einen anderen Protokollierungsmechanismus anzuhängen.
static void Main(string[] args)
{
Trace.Listeners.Clear();
TextWriterTraceListener twtl = new TextWriterTraceListener(Path.Combine(Path.GetTempPath(), AppDomain.CurrentDomain.FriendlyName));
twtl.Name = "TextLogger";
twtl.TraceOutputOptions = TraceOptions.ThreadId | TraceOptions.DateTime;
ConsoleTraceListener ctl = new ConsoleTraceListener(false);
ctl.TraceOutputOptions = TraceOptions.DateTime;
Trace.Listeners.Add(twtl);
Trace.Listeners.Add(ctl);
Trace.AutoFlush = true;
Trace.WriteLine("The first line to be in the logfile and on the console.");
}
Soweit ich mich erinnern kann, können Sie die Listener in der Anwendungskonfiguration definieren, um die Protokollierung zu aktivieren oder zu deaktivieren, ohne den Build zu berühren.
Dies ist eine einfache Klasse, die TextWriter in Unterklassen unterteilt, um die Umleitung der Eingabe sowohl in eine Datei als auch in die Konsole zu ermöglichen.
Verwenden Sie es so
Hier ist die Klasse:
quelle
Console.WriteLine()
, was genau das war, was ich wollte.Console.SetOut(doubleWriter);
. Was eine globale Konsole modifiziert, hat mich ein bisschen gekostet, da ich es so gewohnt bin, in Anwendungen zu arbeiten, in denen praktisch nichts global ist. Gutes Zeug!Schauen Sie sich log4net an . Mit log4net können Sie Konsolen- und Dateianhänge einrichten, die Protokollnachrichten mit einer einzigen Protokollanweisung an beide Stellen ausgeben können.
quelle
Können Sie die Ausgabe nicht einfach mit dem
>
Befehl in eine Datei umleiten ?Wenn Sie spiegeln müssen, können Sie versuchen, eine Win32-Version zu finden
tee
, die die Ausgabe in eine Datei aufteilt.Unter /superuser/74127/tee-for-windows können Sie Tee von PowerShell ausführen
quelle
Sie können die TextWriter-Klasse in Unterklassen unterteilen und dann ihre Instanz der Console.Out mithilfe der Console.SetOut- Methode zuweisen. Dies entspricht insbesondere der Übergabe derselben Zeichenfolge an beide Methoden in der Protokollmethode.
Eine andere Möglichkeit besteht darin, Ihre eigene Konsolenklasse zu deklarieren und die using-Anweisung zu verwenden, um zwischen den Klassen zu unterscheiden:
Um auf die Standardkonsole zuzugreifen, benötigen Sie dann:
quelle
BEARBEITEN: Diese Methode bietet die Möglichkeit, die Konsoleninformationen aus dem Paket eines Drittanbieters umzuleiten. Das Überschreiben der WriteLine-Methode ist gut für meine Situation, aber Sie müssen möglicherweise andere Write-Methoden überschreiben, abhängig vom Paket eines Drittanbieters.
Zuerst müssen wir eine neue Klasse erstellen, die StreamWriter innewohnt, z. B. CombinedWriter.
Starten Sie dann einen neuen Moment von CombinedWriter mit Console.Out.
Schließlich können wir die Konsolenausgabe von Console.SetOut auf den Zeitpunkt der neuen Klasse umleiten.
Der folgende Code ist die neue Klasse funktioniert für mich.
quelle
public override void Write(char value);
,public override void Write(char[] buffer);
,public override void Write(string value);
undpublic override void Write(char[] buffer, int index, int count);
. Andernfalls wird nicht auf der Konsole gedruckt, wenn Sie dieWriteLine(format, ...)
Methode verwenden.Log4net kann dies für Sie tun. Sie würden nur so etwas schreiben:
Eine Konfiguration bestimmt, ob der Ausdruck an die Konsole, die Datei oder an beide gesendet wird.
quelle
Ich denke, was Sie bereits verwenden, ist der beste Ansatz. Eine einfache Methode, um Ihre Ausgabe im Wesentlichen zu spiegeln.
Deklarieren Sie zunächst einen globalen TextWriter am Anfang:
Dann machen Sie eine Methode zum Schreiben:
Verwenden Sie jetzt anstatt zu
Console.WriteLine("...");
verwendenLog("...");
. So einfach ist das. Es ist noch kürzer!Es könnte Probleme geben, wenn Sie die Cursorposition (
Console.SetCursorPosition(x, y);
) verschieben, aber ansonsten funktioniert es gut, ich benutze es auch selbst!BEARBEITEN
Natürlich können Sie eine Methode auf
Console.Write();
die gleiche Weise erstellen, wenn Sie nicht nur WriteLines verwendenquelle
Wie von Arul vorgeschlagen,
Console.SetOut
kann using verwendet werden, um die Ausgabe in eine Textdatei umzuleiten:quelle
Die Entscheidung, eine vom StreamWriter geerbte Klasse zu verwenden, Vorschläge des Benutzers Keep Thinking, funktioniert. Aber ich musste zur Konstruktorbasis hinzufügen. AutoFlush = true:
Und ein expliziter Aufruf an den Destruktor:
Andernfalls wird die Datei früher geschlossen, als er alle Daten aufgezeichnet hat.
Ich benutze es als:
quelle
Vielen Dank an Keep Thinking für die hervorragende Lösung! Ich habe einige weitere Überschreibungen hinzugefügt, um zu vermeiden, dass bestimmte Konsolenschreibereignisse protokolliert werden, die (für meine Zwecke) nur für die Konsolenanzeige erwartet werden.
quelle
Wenn Sie die Konsolenausgabe von einem Code duplizieren, den Sie nicht steuern, z. B. einer Bibliothek eines Drittanbieters, sollten alle Mitglieder von TextWriter überschrieben werden. Der Code verwendet Ideen aus diesem Thread.
Verwendung:
ConsoleMirroring-Klasse
quelle
Sie können tatsächlich eine transparente Spiegelung von Console.Out to Trace erstellen, indem Sie Ihre eigene Klasse implementieren, die von TextWriter geerbt wurde, und die WriteLine-Methode überschreiben.
In WriteLine können Sie es in Trace schreiben, das dann so konfiguriert werden kann, dass es in eine Datei schreibt.
Ich fand diese Antwort sehr hilfreich: https://stackoverflow.com/a/10918320/379132
Es hat tatsächlich bei mir funktioniert!
quelle
Meine Antwort basiert auf der am meisten gewählten nicht akzeptierten Antwort und auch auf der am wenigsten gewählten Antwort, die ich für die eleganteste Lösung halte. Es ist etwas allgemeiner in Bezug auf den Stream-Typ, den Sie verwenden können (Sie können
MemoryStream
beispielsweise einen verwenden), aber ich habe der Kürze halber alle erweiterten Funktionen, die in der letztgenannten Antwort enthalten sind, weggelassen .Verwendung:
quelle