2009-05-18 11 views
3

Ich protokolliere eine Datei mit FileStream.Write(). Wenn die Datei eine maximale Größe erreicht, möchte ich eine Ladung der Protokolle vom Anfang der Datei löschen. Was ist der beste Weg, dies zu tun?Wie erstellt man eine Protokolldatei mit einer maximalen Größe?

Die beste Idee, die ich bis jetzt habe, ist eine zweite Datei zu erstellen. Schreibe alles, was ich von der Originaldatei behalten möchte. Löschen Sie dann die ursprüngliche Datei und benennen Sie die zweite Datei mit dem ursprünglichen Dateinamen um.

Gibt es eine einfachere und effizientere Möglichkeit, dies zu tun?

Antwort

3

Ja und nein ;-)

Was Ihnen wichtig ist: Effizienz, oder simplicty?

Effizienter: Ein traditionelles Rolling Log ist ein Fixed-Size-Record.Sie verwenden eine Direktzugriffsdatei im Lese-/Schreibmodus, verfolgen den aktuellen Datensatzzeiger, und wenn der aktuelle Datensatz == max Datensätze den aktuellen Datensatz wieder auf Null setzt. Offensichtlich gibt dies Einschränkungen für das, was Sie protokollieren können ... DB's tun dies auf "Raw Disk", um sie zu ermöglichen, variable Datensatzgröße wahlfrei zuzugreifen. Dies erfordert auch eine benutzerdefinierte Log-Reader-Anwendung. Yeck!

Simpler (und noch ein bisschen effizienter als das Kopieren von Tausenden von Zeilen von Datei zu Datei): schreibe viele, aber kleinere Protokolldateien. "Roll Over" die Protokolldatei in regelmäßigen Abständen, oder wenn es eine bestimmte Größe erreicht ... d. H. Eine neue Protokolldatei und wenn NumLogs == MaxLogs dann löschen Sie die älteste.

Prost. Keith.

+0

Danke! Ich gehe mit Ihrer einfacheren Version. Ich denke, es ist effizienter als Ihr "effizienter" Vorschlag! –

+0

Ich muss nur zwei Dateien behalten. Der, den ich schreibe, und der vorherige. Wenn die aktuelle Datei voll ist, kann ich eine neue Datei erstellen und die älteste Datei löschen. –

1

Wenn die maximale Größe nicht zu groß ist, können Sie die gesamte Datei in den Speicher laden, löschen Sie die Teile, die Sie löschen möchten, und dann direkt die alte Datei überschreiben.

1

Das klingt nach einem fairen Weg, es zu tun. Da das "Abschneiden" des Dateianfangs bei den meisten Dateisystemen nicht direkt möglich ist, werden Sie gezwungen sein, alle Daten auf die eine oder andere Weise neu zu schreiben. Ihre beiden Optionen sind im Wesentlichen:

  1. Lesen Sie die vorhandenen Protokoll, speichern sie in den Speicher überschreiben dann die gesamte Datei hat den Anfangsteil abgehackt. Dadurch besteht die Gefahr, dass Daten verloren gehen, wenn während des Prozesses ein Fehler auftritt (oder wenn das Betriebssystem/Programm aus irgendeinem Grund unerwartet abstürzt).

  2. Ihre vorgeschlagene Methode zur Herstellung einer neuen Datei zu erstellen und dann die alte löschen. Dies hat den zusätzlichen Vorteil, dass, wenn etwas schief geht beim Erstellen des neuen, Ihr altes noch vorhanden und perfekt intakt ist.

Es scheint auf jeden Fall, wie Sie mit der zweiten Methode zu gehen.

0

Wenn die Größe tut genau sein müssen, vielleicht ist es einfacher Linien zu zählen? Wenn das Maximum erreicht ist, gehe zurück zum Anfang und lösche alles bis einschließlich des Zeilenumbruchs. Dann geh zurück zum Ende.

Natürlich wäre es noch einfacher sein, wenn Sie eine Datei schreiben tun nicht an allen, bis das Programm, an dem Ende zeigen Sie alle zwischengespeicherten Zeilen schreiben. Dies ist jedoch möglicherweise nicht machbar, wenn Ihr Programm für eine lange Zeit läuft und Sie das Protokoll während der Ausführung mit Tail oder etwas Ähnlichem sehen wollen.

7

Verwenden Sie die log4net Bibliothek - es ermöglicht Roll Log-Dateien mit einer maximalen Größe pro Datei und eine maximale Anzahl von Dateien.

http://logging.apache.org/log4net/index.html

+2

Während ich nie log4net verwendet haben, sieht es interessant. Es gibt definitiv etwas, das gesagt werden kann, um das Rad nicht neu zu erfinden, wenn eine brauchbare Lösung verfügbar ist. – itsmatt

+0

@ck, ich nehme an log4net ist ein Port von log4j ... ausgezeichnet! woran werden sie als nächstes denken ;-) Ich danke dir für den Fisch. – corlettk

1

Ich denke, Sie sollten nur die Log-Datei wie ein ring buffer behandeln. Da die Linien möglicherweise variable Längen haben, werden Sie sicherlich manchmal halbe Linien haben - Sie könnten in Betracht ziehen, sie einfach auszublenden.

Ich würde wirklich nicht der Ansicht, die gesamte Datei eine neue Zeile kommt in jedem Umschreiben - viel zu teuer. Vielleicht sollten Sie sogar log4net verwenden oder sich den Quellcode ansehen, um zu sehen, wie es geht.

Verwandte Themen