Seite 1 von 1

LogFile mit Größenbegrenzung

Verfasst: 5. Mai 2010 12:32
von Jordy
Hallo allerseits!

Ich würde gerne meiner Application ein Log-File verpassen. Also eine Textdatei, an die alle möglichen Ausgaben angehängt werden. So weit, so einfach. Jetzt möchte ich aber, dass diese Textdatei eine vorgegebene Größe (einstellbar, z.B. 1MB, 10MB,...) nicht überschreitet.

Wie mache ich das? Eigentlich müßte ich, sobald die Textdatei zu groß ist, die ersten paar Zeilen (mit alten Meldungen) in der Datei entfernen, so dass Platz genug ist, um am Ende der Datei neue Meldungen anhängen zu können, ohne das Limit zu überschreiten.

Leider kenne ich keine direkte Möglichkeit das zu tun. Andererseits ist das doch ein ausgesprochen gängiges Problem. Wie löst man das?

Die mir vorstellbaren Workarounds (also z.B. Umkopieren in eine zweite/temporäre Datei) wären (besonders bei einer log-datei mit einigen MB größe) performancemäßig problematisch.

Ich kann das Log auch nicht im Speicher puffern (und erst beim Beenden der Applikation in passender Größe schreiben) da dies bedeuten würde, dass bei einem Absturz das Log nicht aktuell ist.

Zur Not könnte ich immer neue Dateien anlegen (z.B. für jeden Tag eine neue) und die alten Dateien löschen. Aber dieser ungewollte Kompromiss kann doch nicht der Weisheit letzter Schluss sein? Ist das ursprüngliche Ziel nicht zu erreichen?

Verfasst: 5. Mai 2010 13:52
von franzf
Mit C++/Qt-Mitteln geht Löschen der ersten Zeilen ohne Neuschreiben leider nicht.
Ich würde ganz einfach beim Loggen prüfen, ob das Logfile zu groß wird (QFileInfo::size()). Falls ja -> QFile::rename() (mit Zeitstempel), und dann ein neues Logfile anfangen. Bei Programmende kannst du ja dann auf ein Log zusammenkürzen.

Unter Linux verwendet man für sowas logrotate. Kannst dir ja mal anschauen, was das so bietet und wie die es umsetzen. Oder gleich verwenden :P

Verfasst: 5. Mai 2010 17:07
von Jordy
Mist, das hatte ich befürchtet. Na, trotzdem danke, Du hast mir sehr geholfen!

Verfasst: 5. Mai 2010 17:23
von franzf
Das eigentliche Problem an deinem Ansatz: Ist das Log einmal zu groß, bist du nach jedem Schreiben hinten am Löschen vorne. Und das geht dermaßen auf die Platte... Also altes Log sichern neues Schreiben bis voll -> act Log sichern->neues schreiben usw.

Verfasst: 6. Mai 2010 08:42
von Jordy
Um das Problem zu lösen hätte ich eine "Hysterese" eingebaut. Ich hätte also nicht nur eine Zeile sondern gleich einen bestimmten Prozentsatz der maximalen Größe (sagen wir 10%) frei geräumt, am Anfang der Datei.

Ist aber auch sehr theoretisch, solange QFile sowas garnicht kann :-)

Ich habe es jetzt so gelöst, dass ich tatsächlich immer die aktuelle Datei durch umbenennen archiviere und dann eine neue öffne. Klappt ganz gut.

Verfasst: 6. Mai 2010 11:49
von RHBaum
was verstehst du hier genau unter Logs ?

Logs die fuer den User( also den Benutzer deines Programmes) erweiterte informationen bieten (aka user-logs), oder logs fuer den admin, die über gewisse vorgaenge / schwerwiegende fehler informieren (aka system-logs)

willst du letzteres loggen, solltest eh ned selber fileoperationen durchfuehren, sondern da gibts fuer das jeweilige BS funktionen die du bemuehen kannst (log demon, log systemdienst)

und zu 1teren ....
werden das soviel daten ?
wo schreibst die hin unter linux/windows 7 ? Ins user verzeichniss ? da wird sich der user freuen wenn seinen kostbaren speicherplatz so zumuellst ^^

Ciao ...