[Postfixbuch-users] Weniger Spam? - Logparser

Thomas Gelf thomas at gelf.net
Mo Jan 19 10:07:02 CET 2009


Moinmoin!

Thomas Schwenski schrieb:
> 1. Wie hast Du das Parsing der Logfiles umgesetzt?
> Pollst Du in regelmäßigen Abständen /var/log/mail.log, suchst die letzte
> ausgewertete Zeile und verarbeitest alle neuen Einträge?

Das wäre viel zu langsam und unperformant. Alle Postfix- und Amavis-
Instanzen loggen ins Syslog, Syslog wird zu einem zentralen Syslog-
Server gesendet und dort (durch eine Pipe) an einen Daemon gereicht,
der das Ganze verarbeitet. So haben sowohl Support, als auch Kunden
"live" Zugriff auf gefilterte Log-Dateien.

Hatte erst das Haupt-Augenmerk auf die Geschwindigkeit gelegt, dann
aber schnell gelernt, dass das auf Dauer ein Schuss ins eigene Knie
wird. Der Code wurde unübersichtlich, und am meisten Probleme hat
mir auf diese Weise die Tatsache, dass laufend Dinge, die "später"
passieren, "früher" im Log aufscheinen (was Dank mehrerer Prozesse,
Cores, Server und Switches häufiger auftritt als erwartet).

Habe dann Strategie gewechselt, der Parser erstellt jetzt für jede
Log-Zeile, die er nicht zuordnen kann, ein neues Objekt im Speicher,
und sobald er diesem alles was er braucht (connect, Absender, alle
Empfänger, Amavis-Ergebnis...) zuordnen konnte, wird es in eine
flache, auf Suche optimierte Tabelle (deshalb mit teils redundanten
Daten) geschrieben. Zudem wird "händisch partitioniert", habe mich
dabei für eine Tabelle pro Tag entschieden.

Aktuell funktioniert die "Garbage Collection" noch nicht so, wie
ich das möchte, der Parser wächst deshalb im RAM gaaanz langsam
an. Derzeit löse ich das ganz brutal, er erhält einfach ein Kill-
Signal, wenn er zu groß wird, schreibt einen Dump mit den aktuellen
Objekten und verwirft jene, die "zu alt" sind. Dann wird er wieder
gestartet, liest den Dump ein und macht in der Pipe dort weiter, wo
er aufgehört hatte.

Bei Gelegenheit muss ich diesen Teil noch überarbeiten, ich möchte
dass der Daemon sich selbst um seinen Speicher kümmert. Das aktuelle
Verhalten ist nicht weiter schlimm, ich "verliere" in der Datenbank
lediglich endlos lang dauernde Verbindungen oder seltsam abgebrochene
Verbindungen, die ohnehin nur von irgendwelchen Trojanern kommen.

> 2. Wie koordinierst Du das mit der Rotation der Logfiles?

Die Datenbank dient lediglich der Log-Suche der letzten Tage, ich
behalte immer einen Monat dort auf, stelle aber lediglich die letzten
beiden Wochen zur Verfügung. Aufgeräumt wird mit "DROP TABLE".

Parallel dazu schreibt syslog-ng ein Log pro Server, exakt um Mitter-
nacht wird jeweils ein neues File begonnen, das alte später komprimiert
und zusätzlich zwecks Archivierung auf unsere Storage-Server geschoben.
Außerdem schreibt jeder Server zusätzlich sein lokales Syslog, bei
Wartungs-Arbeiten (oder ungeplanten Ausfällen) am Syslog-Server schieben
wir die einfach zusätzlich auf den Server. Lokal werden jeweils nur fünf
Tage aufbewahrt, in der Zeit sollten wir locker merken, dass es ein
Problem gab.

> Und einfach nur so: welche Programmiersprache verwendest Du?

Naja... PHP. Hatte als alter Perl-Fan erst mit Perl begonnen, da aber
das Ding auch noch von jemandem verstanden werden sollte, wenn ich mal
nicht da bin, wir viele PHP-Programmierer haben - und man auch mit PHP
durchaussauberen, performanten und schönen Code schreiben kann, ist es
eben PHP geworden. Mit allen damit verbundenen Nachteilen, wenn es um
Signalhandler usw geht - PHP ist manchmal echt ziemlich krank.

Aber: es funktioniert, trotz im Schnitt meist weit über 100 Log-Zeilen
pro Sekunde - ich habe bis dato noch nichts Vergleichbares gefunden.

Mit liebem Gruß
Thomas Gelf




Mehr Informationen über die Mailingliste Postfixbuch-users