PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Logfiles zusammenführen



Flightbase
30.06.10, 19:10
Moin moin,

ich habe aktuell das Problem, dass ich mit einem Projekt über 3 rootserver gewandert bin - und jetzt von 3 rootservern apache2 logfiles habe. natürlich jeweils mit vhost logs, damit das nicht zu einfach wird. erschwerend kommt hinzu, dass die verschiedenen logfiles unterschiedlich im logrotate waren - und somit stimmt vhost1-access.log.4.gz zeitlich nicht mit vhost2-access.log.4gz überein ;(

ich könnte mir schon den tag und die uhrzeit des jeweiligen umzugs raussuchen - es bleibt aber das problem, dass ich alle vhost datein erstmal mergen muß.
wenn ich mir da jetzt das ausmaß ansehe:

server 1:
root@xxxxx:~/42/export42/logs# du -sh
18G .

server 2:
root@xxxxx:~/120/export120/logs# du -sh
38G .

server 3:
root@xxxxx:~/88/logs# du -sh
13G .

in den ordnern liegen nur die access datein als .gz drin - ich habe mal wahllos eine entpackt:

time unp www-access.log.13.gz

real 1m20.086s

na ja - eine minute 20 für das entpacken.... aber jetzt kommts:

ls -hal www-access.log.13*
-rw-r--r-- 1 root root 6.9G 2010-06-30 19:59 www-access.log.13
-rw-r----- 1 root root 506M 2009-10-08 07:22 www-access.log.13.gz

wenn ich jetzt mal grob überschlage komme ich auf ca. 1 TB plain text an logfiles. das ganze zu sortieren dauert vermutlich tage bis wochen.

aktuell habe ich mit dem logresolvemerge.pl script angefangen, dass bei awstats dabei ist.
das ist aber extrem lahm.

hat jemand einen vorschlag, wie ich aus mehreren ordnern alle vorhandenen datein mergen kann? output sollte natürlich auch nicht eine datei sein - sondern sagen wir 5gb häppchen.

heissen dank für jeden tipp im vorraus!

greets, Nik

ThorstenHirsch
30.06.10, 19:36
Wie wär's mit ner Tabelle?
Du teilst den Inhalt der Logfiles in Spalten auf, z.B.

<typ/quelldatei>,<timestamp>,<user>,<text>

...und haust alles aus allen Dateien in die Tabelle rein. Den <typ/quelldatei> machst du anhand des Dateinamens fest, ebenso die genaue Struktur der Datei (wenn sie sich unterscheiden, was bestimmt der Fall ist). Ist halt schon ein bisschen Arbeit und für eine vernünftige Datenbankanbindung würde ich kein Shell-Skript, sondern Perl/Python/Ruby nutzen.

Wenn i/o nicht der Flaschenhals ist, kannste auch gleich mehrere Instanzen des Skripts laufen lassen, damit sollte die DB ja zurecht kommen. Und dann kannste gleich mal benchmarken, ob MySQL oder PostgreSQL schneller ist. ;)

Jigsore
30.06.10, 19:45
Wir haben dieses "Problem" ebenfalls, sogar recht häufig. Größte Zusammenführung waren bisher 2,5tb an Logdaten von Webservern auf einen Schlag (entpackt).

Ich simples Bashskript schnappt sich jede Zeile, schaut nach dem Datum und packt es in eine neue Datei. In der Regel ist nach einem Monat ein Log abgeschlossen und wird dann gepackt oder anderweitig verarbeitet.

Dauert zwar extrem lange (2 1/2 Tage für 2.5tb inklusive Statistiken für AWStats/Webalizer/PFlog) aber tut 1a.

Flightbase
30.06.10, 19:54
wie genau sieht dein bash-script aus?

öffnet es alle dateien als stream und rappelt dann basierend auf einer zeile alle anderen durch?
mit etwas wohlwollen könnte man das auch so lesen, dass für jede zeile eine neue datei erstellt wird ;)

weil ich gefragt wurde:
das ist ein 64 bit ubuntu system, 12 gb ram, hardware raid5, i7-975 Quad-Core HT

greets, Nik

HBtux
30.06.10, 20:43
Wäre es nicht sinnvoller, die Logfiles gleich beim entstehen zusammen zu führen, anstatt eine halbe Ewigkeit und unmengen an Daten abzuwarten.....

Ggf. nicht erst in eine Datei schreiben, sondern gleich in eine Datenbank.

Was sind denn das für Daten, die Du vom Tag des Umzugs brauchst.....?
Die Masse an Daten kann das ja nicht sein.
Wäre es vielleicht sinnvoll, solche Umzugsdaten nicht in die access.log, sondern in eine extra Log zu schreiben....

Wenn Du die Daten von einem Umzugstag brauchst, könntest Du die Log-Files anhand des Timestamp vorselektieren um nicht alle Logfiles zu bearbeiten.....

Jigsore
30.06.10, 21:43
öffnet es alle dateien als stream und rappelt dann basierend auf einer zeile alle anderen durch?


mit etwas wohlwollen könnte man das auch so lesen, dass für jede zeile eine neue datei erstellt wird ;)


Natürlich habe ich in *einer* Logdatei alle passenden Daten über einen definierten Zeitraum, nicht für jede Zeile eine Datei ;)

Es sortiert nach Woche des Jahres und/oder nach Monaten. Kommt drauf an was ich brauche.

Es gibt zwar komerzielle Lösungen die so etwas können (Windmill z.b.), allerdings sind die noch langsamer, haben in der Regel einen Datenbankbasierenden ansatz (will ich wirklich XXgb große Datenbanken haben?) und, dass Hauptargument, kommen nicht mit gemischten Logformaten klar.

ThorstenHirsch
30.06.10, 22:07
Also ich will lieber xx GB große Datenbanken als Dateien haben. In Datenbanken kann man die Daten wenigstens schön abfragen, das geht viel schneller und besser als die Suche in einem Texteditor. Gut, wenn man die Daten gleich weiterverarbeiten will, kann man bei Textdateien mit grep, cut, awk, sed punkten, aber wenn ich was auswerten will, bin ich mit einer DB besser bedient.

Jigsore
30.06.10, 23:00
In der Regel haben Mittelständische Betriebe oder Agenturen keine Datenbanksysteme die die Mengen an Daten in einer annehmbaren Zeit schaffen könnten (Import/Auswertung/Export).

Für einen Kunden haben wir einen Cluster aus MySQL Servern mit Memory (Puffer/Realtimeauswertungen) und Innodb (storage) Engines am laufen. Da kommen monatlich mehrere Gigabyte an Webserverdaten zusammen. Braucht zwar nicht viel Pflege, aber bis das System rund lief ist schon einiges an Zeit vergangen und dadurch sind natürlich erhebliche Kosten entstanden und entstehen durch Wartung immer noch.

Für einen kleinen Bruchteil der oben genannten Kosten stelle ich mir lieber einen Dedizierten Server hin, packe ein Paar Sas Platten in einem Raid10 Verbund rein und setze mich einen halben Tag an ein Skript.

Abgesehen von Echtzeitstatistiken bei großen Datenmengen hat ein Datenbankbasiertes System keinerlei Vorteile.