4 Stimmen

Effiziente Art der Protokollierung in eine txt-Datei aus einem Konsolenprogramm

Was wäre der effizienteste Weg der Aufzeichnung in ein Protokoll (.txt) aus einem Konsolenprogramm auf C# und .NET 2.2? Mein Programm Schleifen mehrere Male immer verschiedene Daten ausgeben, basierend auf was der Benutzer will, so bin ich auf der Suche nach den effizientesten Weg, dies zu erreichen.

Ich weiß, dass ich einen Stream immer wieder öffnen und dann schließen kann, aber jedes Mal, wenn ich das tue, würde ich nur eine Zeile schreiben, und beim nächsten Mal (Sekunden später) macht das Programm eine Schleife und muss erneut schreiben. Meiner Meinung nach scheint das nicht sehr ressourcenfreundlich zu sein.

Ich verwende mehrere Threads, die alle Ausgabedaten haben, die ich protokollieren möchte (das Öffnen/Schließen derselben Datei oder der Zugriff auf dieselbe Datei in verschiedenen Threads könnte schlecht sein). Die "hält einen Verweis auf einen Stream Writer, die Auto-Flushes" klingt wie eine gute Idee, aber ich weiß nicht, wie man das tun.

16voto

Jorge Ferreira Punkte 92489

Erwägen Sie die Verwendung von log4net :

ein Werkzeug, das den Programmierer bei der Ausgabe von Log-Statements an eine Vielzahl von Ausgabezielen unterstützt... Wir haben das Framework im Geiste an das ursprüngliche log4j angelehnt und gleichzeitig die Vorteile der neuen Funktionen der .NET-Laufzeitumgebung genutzt. Weitere Informationen über log4net finden Sie in der Merkmale Dokument...

3voto

EBGreen Punkte 35149

Ich akzeptiere den Leistungsabfall, der mit dem Öffnen und Schließen jeder Zeile einhergeht, die ich schreibe. Es ist eine Entscheidung für die Zuverlässigkeit. Wenn Sie alles im Speicher halten und es zu einem schweren Absturz kommt, haben Sie keinerlei Protokollinformationen, die Ihnen bei der Fehlersuche helfen. Wenn dies für Sie kein Problem darstellt, dann bietet die Speicherung im Arbeitsspeicher definitiv eine bessere Leistung.

3voto

Wolfwyrd Punkte 15372

Sie könnten sich in den Tracing-Rahmen einklinken, der Teil der CLR ist. Mit einer einfachen Klasse wie: http://www.chaosink.co.uk/files/tracing.zip können Sie selektiv Diagnoseinformationen protokollieren. Zur Verwendung fügen Sie die Klasse zu Ihrer Anwendung hinzu. Erstellen Sie eine Instanz des Tracers in Ihrer Klasse wie:

private Tracing trace = new Tracing("My.Namespace.Class");

und rufen Sie es mit auf:

MyClass()
{
    trace.Verbose("Entered MyClass");
    int x = 12;
    trace.Information("X is: {0}", x);
    trace.Verbose("Leaving MyClass");
}

Es gibt 4 Informationsebenen im eingebauten Tracing Framework:

Ausführlich - Zum Protokollieren des Programmablaufs

Informationen - Zur Protokollierung spezifischer Informationen, die für Monitore von Interesse sind

Warnung - Zum Protokollieren eines ungültigen Zustands oder einer wiederherstellbaren Ausnahme

Fehler - Zum Protokollieren einer nicht behebbaren Ausnahme oder eines nicht behebbaren Zustands

Um von Ihrer Anwendung aus auf die Informationen zuzugreifen, fügen Sie in der app.config (oder web.config) Folgendes hinzu:

<system.diagnostics>
    <trace autoflush="false" indentsize="4">
        <listeners>
            <add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="c:\mylogfile.log" />
        </listeners>
    </trace>
    <switches>
        <add name="My.Namespace.Class" value="4"/>      
    </switches>
</system.diagnostics>

Sie können auch Hörer für die Veröffentlichung im Ereignisprotokoll oder an anderen Stellen, die Sie interessieren, anhängen. Weitere Informationen über das Tracing Framework finden Sie unter:

http://msdn.microsoft.com/en-us/library/ms733025.aspx

2voto

Tigraine Punkte 22698

Ich bin mit der Verwendung von log4net einverstanden.

Aber wenn Sie wirklich etwas Einfaches brauchen, sollten Sie nur ein Singleton haben, das einen Verweis auf einen StreamWriter enthält, der bei jedem WriteLine automatisch gespült wird.

Auf diese Weise bleibt die Datei während der gesamten Sitzung geöffnet, so dass der Overhead des Schließens/Öffnens vermieden wird, ohne dass die Protokolldaten im Falle eines Absturzes verloren gehen.

0voto

Mats Punkte 14225

Ein einfacher Ansatz wäre, einen TextWriterTraceListener bereitzustellen und ihn zur Sammlung der TraceListeners der Trace-Klasse hinzuzufügen. Dadurch werden alle Ihre Trace.Write... Aufrufe automatisch in die entsprechende Datei geschrieben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X