Frage

Angenommen, Sie haben eine Datei, die Sie programmatisch Informationen sind die Anmeldung in in Bezug auf einen Prozess. Kinda wie der typische Debug Console.WriteLine, aber aufgrund der Art des Codes Sie testen, müssen Sie nicht auf eine Konsole zu schreiben auf, so dass Sie es wie eine Datei irgendwo zu schreiben. Mein aktuelles Programm verwendet System.IO.StreamWriter für diese Aufgabe.

Meine Frage geht es um die Annäherung an die Streamwriter verwenden. Ist es besser, nur einen Streamwriter Instanz zu öffnen, tun alle der schreibt, und schließen Sie es, wenn der gesamte Prozess wird getan? Oder ist es eine bessere Idee, eine neue Stream Instanz zu öffnen eine Zeile in die Datei zu schreiben, dann sofort schließen und tut dies für jedes Mal etwas Bedürfnisse in geschrieben werden? Im letzteren Ansatz würde dies wahrscheinlich durch ein Verfahren erleichtert wird, nur, dass für eine bestimmte Nachricht tun würde, anstatt den Hauptprozess Code mit übermäßigen Mengen von Linien Blähungen. Aber mit ist ein Verfahren zur Hilfe in dieser Implementierung nicht notwendigerweise es die bessere Wahl. Gibt es signifikante Vorteile einen Ansatz oder die andere zu pflücken? Oder sind sie funktionell gleichwertig, so dass die Wahl auf den Schultern des Programmierers?

War es hilfreich?

Lösung

Die wiederholte Öffnen / für jeden Schreib eine neue Stream Schließung wird eine Menge von Ressourcen für die GC erzeugen und verhängen Overhead auf dem App aufgrund der tatsächlichen Lookup der Datei für jede offene Operation. Auf der anderen Seite, einen einzelnen Stream offen hält eine Sperre für die Datei halten. Es hängt also.

Sie wollen nicht Ihr Logging-Mechanismus eine Performance-Engpass zu werden, so schreiben zu einem einzigen Strom. Machen Sie es ungepufferte oder Autoflush für kritische Fehlersuche (aber darauf hingewiesen werden, dass auch eine Auswirkung auf die Leistung hat).

würde ich das Modell der log4net folgen, erstellen Sie einen statischen Protokollstrom und Schreiben zu diesem Singleton. Schauen Sie in log4net sowieso, also rollen Sie nicht Ihre eigene. http://logging.apache.org/log4net/index.html

Andere Tipps

Schauen Sie sich vorgewalzt Logging-Implementierungen; sie können Sie eine Menge Kopfschmerzen ersparen. Offensichtlich hält den Strom offen Mittel Sie einige der End-Daten verloren gehen könnten, wenn es stürzt ab, sondern von Puffern die IO mehr Gaing Leistung kann. Einige Implementierungen können auch bieten Funktionen wie asynchrone Protokollierung von einem Spooler / queue.

Ich würde Puffer / die Daten Warteschlange und in die Datei schreiben, sobald es einen Schwellenwert erreicht und spülen Sie die gesamte Warteschlange, wenn die Anwendung geschlossen / Ausgänge normal.

Das einzige Problem dabei ist, bei einem Absturz der Anwendung, können Sie die Elemente in der Warteschlange verlieren ...

HTH.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top