LogFile mit Größenbegrenzung

Alles rund um die Programmierung mit Qt
Antworten
Jordy
Beiträge: 22
Registriert: 15. August 2005 17:22

LogFile mit Größenbegrenzung

Beitrag 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?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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
Jordy
Beiträge: 22
Registriert: 15. August 2005 17:22

Beitrag von Jordy »

Mist, das hatte ich befürchtet. Na, trotzdem danke, Du hast mir sehr geholfen!
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
Jordy
Beiträge: 22
Registriert: 15. August 2005 17:22

Beitrag 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.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
Antworten