Log Datei auslesen
-
Hi,
ich habe ein Programm geschrieben, welches eine Logdatei schreibt. Nun möchte ich die Datei hin und wieder auslesen und die letzten n Einträge ausgeben.
So ungefähr sehen die Logeinträge aus:
[08:12:44 08/23/2005] (info) Begin of logfile.
[08:12:44 08/23/2005] (info) Forking into background (pid: 4092).
etc ..Nun habe ich aber von diesen Logeinträgen > 5.000.000 in der Datei und wenn ich die letzten 5 davon ausgeben will, muss ich zwangsläufig die ganze Datei durchgehen, was natürlich ein bisschen Zeit kostet.
Ich habe das erstmal so gelöst:
void log_find(struct log *log, struct stringlist *slist, enum log_level level, unsigned int count) { char buffer[MAXLEN * 4]; FILE *logfile; if(!(logfile = fopen(log->filename, "r"))) return; while(!feof(logfile)) { buffer[0] = '\0'; fgets(buffer, MAXLEN * 4, logfile); if(slist->count == count) stringlist_remove(slist, 0, 1); stringlist_add(slist, strdup(buffer)); } fclose(logfile); }
Dazu muss ich noch sagen: stringlist ist einfach nur ein Array von char *.
In der while Schleife lese ich die Zeile aus und schaue dann, ob ich schon n Elemente in meiner Liste habe. Wenn ja, lösche das Element auf Pos 0 und schiebe alle Elemente >0 einen nach unten. Danach füge ich die neue Zeile in die Liste ein.
Nun ist das natürlich sehr aufwendig, wenn die Logfile entsprechend groß wird, daher dachte ich mir, wäre es ja einfacher mit fseek(logfile, 0, SEEK_END); ans Ende zu springen und die Datei rückwärts auszulesen. Allerdings weiß ich nicht, ob es möglich ist, eine Datei von hinten nach vorne auszulesen.
Weiß zufällig jemand, ob und wenn ja wie man das bewerkstelligen kann?
Ich wollte eigentlich die Forensuche benutzen, weil ich meine, irgendwann hier mal was darüber gelesen zu haben, aber irgendwie funktioniert sie nicht.
-
Ich bin mir nicht sicher, ob es möglich ist eine Datei von hinten nach vorne auszulesen.
Aber wenn du festlegst, dass ein Eintrag genau 40 Zeichen lang ist, dann kannste doch genau dahin springen.fseek(logfile, 40*n, SEEK_END);
Und dann die Datei ganz auslesen.
-
Leider sind die Zeilen aber unterschiedlich lang
-
Du kannst ja einmal auf Verdacht hin zb 1 kb vor das ende der Datei springen und dann so wie du es gemacht hast bis zum Schluss lesen. Wenn du nicht genug Logeinträge findest kannst du es ja nochmal mit 2 kb versuchen.
Kurt
-
Mhh, das wäre ne Idee. Thx schon mal.