Ich denke, das sollte eine einfache Sache sein, aber es fällt mir schwer, es herauszufinden.
Ich versuche, ein Skript zu schreiben, das eine der Apache-Protokolldateien überwacht und bestimmte Maßnahmen ergreift. Aber wie soll ich die Protokolldatei überwachen?
Jedes Mal, wenn eine neue Zeile in das Protokoll geschrieben wird, möchte ich, dass dieser Eintrag überprüft wird, um festzustellen, ob er mit dem übereinstimmt, wonach ich suche, und wenn ja, passiert x. Wenn ich das manuell mache, habe ich cat oder tail -f verwendet. Ich möchte das Skript nicht alle 30 Sekunden über cron ausführen und das gesamte Protokoll (oder sogar die letzten 5 Zeilen) durchgehen, um herauszufinden, welche dieser Zeilen seit der letzten Ausführung des Skripts neu sind, und dann einige Dinge.
Gibt es eine Möglichkeit, nur den einzelnen neuen Eintrag im Protokoll zu überprüfen?
quelle
|
wurden. In einigen Fällen kann es jedoch einfacher und klarer sein, Named Pipes zu verwenden.Wenn Sie als Syslog-Daemon haben
syslog-ng
(wahrscheinlichrsyslogd
auch), können Sie das verwenden.Konfigurieren Sie es einfach, um die Apache-Protokolldatei im Auge zu behalten, oder konfigurieren Sie Apache alternativ so, dass Protokolle mit der
CustomLog
Direktive und an die Syslog-Funktion gesendet werdenlogger
.Der Syslog-Daemon verwendet dann den Mustervergleich und führt $ foo aus, wenn eine Übereinstimmung gefunden wird. In syslog-ng können Sie beispielsweise einen Protokolldatei-Hook einrichten und wie folgt filtern:
Und dann ruft syslog-ng ein externes Skript auf
Zum Schluss alle zusammen:
Wenn Sie diese Technik verwenden, erzeugt syslog-ng Ihren Skripthintergrund und wartet darauf, dass neue Inhalte angezeigt werden. Aus diesem Grund müssen Sie Ihre Skripte ändern, um auf die Eingabe von STDIN zu warten. Hier ist ein kurzes Perl-Beispiel:
Ich werde mit meiner Antwort nicht tiefer gehen, bis ich weiß, dass Sie diese Technik ausprobieren möchten.
quelle
Sie können die zuletzt gelesene Zeile aufzeichnen. Lesen Sie bei jedem neuen Lauf von der letzten + 1-Zeile bis zum Ende der Datei und aktualisieren Sie den Datensatz.
Beachten Sie jedoch, dass die Protokolldatei möglicherweise gedreht wird. So sollten Sie beispielsweise die Inode-Nummer aufzeichnen.
fail2ban implementiert die Überwachung von Protokolldateien so, wie Sie es zu wollen scheinen. Vielleicht einen Blick darauf werfen? Entweder können Sie einige Ideen ausleihen oder sie tatsächlich verwenden.
quelle
Sie könnten diff verwenden. Kopieren Sie die Protokolldatei in eine temporäre Datei.
Nehmen Sie einen Unterschied zwischen der Live-Protokolldatei und der temporären Datei.
Führen Sie den Mustervergleich auf dem resultierenden Diff aus.
Idee aus dem nagios check_log Plugin. Weitere Informationen finden Sie unter http://www.kilala.nl/Sysadmin/index.php?id=715 .
quelle
Wenn fail2ban nicht für Ihre Anforderungen geeignet ist, können Sie versuchen, flog.c zu ändern , das von Markus J. Ranum geschrieben wurde:
"Dieses kleine Dienstprogramm entspricht" tail -f ", ist jedoch intelligent genug, um das Ändern von Dateien zu handhaben, wenn ein Protokollrotator die Datei während der Ausführung unter dem Benutzer entfernt. Im Gegensatz zu" tail -f "ist dieses Programm auch klug genug, um zu beenden, wenn sich der Benutzer abmeldet (!) und keine Protokolle für immer an die pty ausspuckt. Es werden keine Anstrengungen in Bezug auf Eleganz oder Leistung unternommen. "
Sie können ändern, um zu überprüfen, ob eine neue Linie Ihrem gewünschten Muster entspricht, und entsprechend handeln.
quelle
Wenn Sie eine Python-Lösung wünschen, lesen Sie Pygtail: https://github.com/bgreenlee/pygtail
Es basiert auf
logcheck
demlogtail2
Toolquelle
quelle