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?
LogFile mit Größenbegrenzung
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
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
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.
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.
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 ...
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 ...