Tutorial: Logs verarbeiten mit grep und tail

Auch Konsolen-Hasser wie ich, müssen anerkennen, dass manche Dinge eben per Kommandozeile einfacher zu erledigen sind. Als herausragendes Beispiel kann man das Verarbeiten von Logs nennen.

Wie sonst sollte man vernünftig Apache Log Files verarbeiten?

Als Inspiration diente mir ein Artikel von Chris Hope.

Dazu nutzt man eine Kombination aus zwei Befehlen: tail und grep.

  • tail liefert die letzten Zeilen einer Datei
  • grep (oder egrep) filtert Suchergebnisse auf Dateien

Alles mitlesen

mit folgendem Befehl kann man wunderbar die Zugriffe auf den Apache Webserver verfolgen:


tail -f /var/logs/apache2/XXX-access.log

Wobei XXX bei mir der Hostname-Name ist. Sie finden die richtige Datei in /etc/apache2/httpd.conf unter CustomLog.

Der Parameter „-f“ (=follow) zeigt permanent den Zuwachs der Log-Datei an. Abbrechen kann man die Ausgabe mit Strg+C.

Eine bestimmte IP filtern

Mit Hilfe von grep kann man die Ausgabe auf eine bestimmte IP hin filtern.

tail -f /var/logs/apache2/XXX-access.log | grep 12.34.56.78

Die IP 12.34.56.78 ist in diesem Falle meine eigene.

Hier filtern wir mit Hilfe von regulären Ausdrücken. Daher würde ein Filter „12.34.56.78“ auch „12a34b56c78“ filtern, da ein Punkt („.“) für jedes mögliche Zeichen steht.

Wenn Sie auf Nummer Sicher gehen wollen, müssen Sie die Punkte „escapen“ und den Suchstring in Anführungsstriche setzen.

tail -f /var/logs/apache2/XXX-access.log | grep "12\.34\.56\.78"

Eine bestimmte IP ausschließen

Wenn Sie die Zugriffe einer bestimmte IP – zum Beispiel der eigenen – ausschließen möchten, verwenden Sie folgenden Befehl:


tail -f /var/logs/apache2/XXX-access.log | grep -v "12\.34\.56\.78"

Der Parameter „-v“ schließt einen Suchstring aus.

Einen bestimmten Dateityp filtern

Wenn man nur wissen möchte, wie oft oder und von woher Zugriff auf einen bestimmten Dateiyp erfolgt – zum Beispiel auf JPG-Dateien, kann man folgenden Befehl nutzen:


tail -f /var/logs/apache2/XXX-access.log | grep .jpg

Oder Sie möchten wissen, wann auf die Datei „robots.txt“ zugegriffen wird


tail -f /var/logs/apache2/XXX-access.log | grep robots.txt

Wenn Sie nur wissen möchten, wie oft bisher auf die Datei „robots.txt“ zugegriffen wurde und woher, empfiehlt es sich, statt tail cat zu nehmen:


cat /var/logs/apache2/XXX-access.log | grep robots.txt

Alles filtern, was keine Webseite ist

Es kann schwierig sein, nur Webseiten zu filtern, da es keine einheitlichen Dateiendung gibt und manche Zugriff auch mit „/“ oder einem Anhang – bspw. „?wert=123“ enden könnten.

Daher gehen wir den umgekehrten Weg und filtern alles aus, was eindeutig keine Webseite ist.


tail -f /var/logs/apache2/XXX-access.log | egrep -v "(.gif|.jpg|.png|.swf|.ico|.txt|.xml|.css|.js|.rss)"

Mit dem Pipe-Symbol „|“ kann man zu filternde Alternativen angeben. Bitte die Anführungsstriche nicht vergessen.

Wir nutzen hier egrep; egrep steht für „extended grep“ und bietet einen erweiterten Befehlssatz für reguläre Ausdrücke. Alternativ kann man auch grep mit dem Paramter „-e“ nutzen.

Welche Logs  sind noch wichtig?

Die per Default wichtigsten Logs finden sich im Ordner /var/log/

  • /var/log/auth.log
  • /var/log/syslog
  • /var/log/cron.log
  • /var/log/daemon.log
  • /var/log/kern.log
  • /var/log/lpr.log
  • /var/log/mail.log
  • /var/log/user.log
  • /var/log/mail.info
  • /var/log/mail.warn
  • /var/log/mail.err
  • /var/log/news/news.crit
  • /var/log/news/news.err
  • /var/log/news/news.notice
  • /var/log/debug
  • /var/log/messages
  • /var/log/apache2/error.log
  • /var/webmin/miniserv.error

Ich kann hier  Angaben zu Debian-System machen. Bei Problemen sind die Logs auf jeden Fall immer die erste Anlaufstelle.