Der Einzeiler-Skript der zeigt, wie es Ihrem Web-Server geht

Einträge pro Minute in httpd-Logdatei

$ sed -n 's/.*20[0-9][0-9]:\(.*\):.. +0.00.*/\1/p' "$@" | uniq -c

Nehmen wir an, Sie vermuten, dass eine Ihrer Web-Server nicht ordnungsgemäß funktioniert. Die Nutzer beschweren sich, dass einige Seiten nicht geladen werden. Sie lassen mit tail -f die Access-Log-Datei protokollieren. Die Einträge flitzen auf dem Bildschirm vorbei, also es sieht so aus, als würde der Server was ordentliches tun.
Aber Ihre Augen können zwischen 500 Einträge pro Minute und 5000 Einträge pro Minute nicht unterscheiden.
Wäre es nicht schön, sehen zu können, wieviele Log-Einträge pro Minute tatsächlich produziert werden?
Mit dem kleinen apache.byminute Skript – kein Problem.
Um den Skript in Ihrem bin-Verzeichnis mit dem obigen Kommandos zu kreieren, ein Terminalfenster öffnen und folgendes tun:

$ mkdir -p ~/bin
$ cat > ~/bin/apache.byminute
#!/bin/bash
sed -n 's/.*20[0-9][0-9]:\(.*\):.. +0.00.*/\1/p' "$@" | uniq -c
<CTRL-D>
$ chmod +x ~/bin/apache.byminute
$ export PATH=$PATH:~/bin
$ hash -r

Sie haben nun eine Bash-Shell-Skript-Datei namens apache.byminute erstellt und sie als ausführbaren Befehl auf der Kommandozeile zur Verfügung gestellt.
Die export PATH sollte in Ihre ~/.bash_profile Datei eingetragen werden, wenn nicht vorhanden. Beim nächsten Öffnen eines Terminals bzw. Neulogin, werden alle Kommandos in Ihrem bin auf der Kommandozeile verfügbar sein
Dieser Skript kann direkt mit ein Access-Log als Argument aufgerufen werden, z.B.:

$ apache.byminute /var/log/httpd/access_log

Dies würde Information zu allen Zugriffe auf den Web-Server ergeben. D.h. jeder Zugriff auf jede Art von Datei (php, js, css, html, jpeg, png usw.) wird gezählt.
Spezifischere und nützlichere Information wird ausgegeben, wenn das Kommando mit noch einem grep kombiniert wird, z.B.:

$ grep 'GET /wp-admin/admin.php' /var/log/httpd/apache_access.log | apache.byminute

Was genau geht hier vor?
Das grep Kommando sucht den regulären Ausdruck bzw. Zeichenmuster /wp-admin/admin.php in der Datei apache_access.log. Nur Zeilen, die dem Muster entsprechen, werden vom grep ausgegeben. Zeilen, die Zugriffe auf andere URLs protokollieren, werden nicht gezählt.
Das sed Kommando such den regulären Ausdruck

.*20[0-9][0-9]:\(.*\):.. +0.00.*

Das heißt, in der Folge werden gesucht:
1) eine beliebige Zeichenkette “.*
2) 20 gefolgt von zwei beliebigen Zeichen “20[0-9][0-9]
3) ein Doppelpunkt “:”
4a) eine beliebige Zeichenkette “\(.*\)
4b) Bei “\(.*\)“, die Backslash-Escaped-Klammern markieren ein Teil der Zeichenkette für die spätere Nutzung im zweiten Teil des sed-Ausdrucks. Das Substitutionsmuster “\1” wird genutzt, um nur das Teil der Zeichenkette auszugeben, dass dem Ausdruck innerhalb des Backflash-Escaped-Klammern entspricht
5) ein Doppelpunkt gefolgt von zwei beliebigen Zeichen gefolgt von einem Leerzeichen “:..
6) ein Pluszeichen, einen Null, ein beliebiges Zeichen und zwei Nullen “+0.00
7) und noch eine beliebige Zeichenkette “.*
Die Ausgabe davon sieht folgendermaßen aus:


20:57
20:57
20:57
20:57
...
20:57
20:58
20:58
20:58
...
20:58
20:59
20:59
20:59
20:59
21:00
21:00
...

Das sind jeweils die Uhrzeit jedes einzelnen ausgesuchten Log-Eintrags in hh:mm Format
Mit einem pipe wird diese Ausgabe durch uniq geleitet.  
Aber nicht irgendein beliebiges uniq.  Dieser uniq-Aufruf hat die Option -c, d.h. “zeige die gedoppelten Zeilen nur einmal, mit der Anzahl des Auftretens vor der Zeile”
So uniq -c könnte in diesem Fall folgendes ausgeben:


317 20:57
221 20:58
4 20:59
244 21:00

Das sagt uns, dass /wp-admin/admin.php 317 mal in der Minute beginnend mit 20:57 aufgerufen wurde, 221 mal um 20:58, nur 4 mal um 20:59 und 244 mal um 21:00.
Wenn man das Kommando über die Log-Dateien von ein paar Tagen laufen läßt, bekommt man ein Gefühl dafür, wieviel Traffic man in der Minute man normalerweise erwarten würde. Zeiten mit ungewöhnlich wenig oder viel Traffic sind leicht zu sehen. Lücken, d.h. Minuten ohne Einträge, sind auch leicht zu sehen. Wenn man normalerweise pro Minute Zahlen in den Hunderten sieht, und plötzlich sieht man nur zehn oder zwanzig, dann weiss man, dass irgendwas nicht stimmt. Wenn manche Zeiten in der falschen Reihenfolge ausgegeben werden, dann weiss man, dass die Verarbeitung mancher Zugriffe zu lange dauert.
Man kan den regulären Ausdruck des sed-Kommandos leicht ändern, um nur Stunden, bzw. Stunden, Minuten und Sekunden oder sogar Sekunden in Zehnerschritten darzustellen; das ideale Format ist abhängig von der Auslastung Ihres Servers.
Weil Sie mit grep gewappnet sind, können Sie Kommandos aufrufen um beliebige für Sie interessante Muster auszusuchen und zu zählen. Sie haben die enorme Flexibilität, nach vielen unterschiedlichen Mustern in kurzerster Zeit zu suchen. Sie können in Echtzeit sehen, wie es läuft, wenn Sie tail -f nutzen, um Einträge us der wachsenden Logdatei auszugeben und durch das Zähler-Kommando zu pipen:

$ tail -f access_log | grep 'wp-admin.php' | apache.byminute

Wie man sieht, man kann auf der Unix-Kommandozeile sehr mächtige Ad-Hoc-Werkzeuge mit nur ein oder zwei Code-Zeilen kreieren. Diese Art von Werkzeug ist in vielen unterschiedlichen Situationen anwendbar..
Bei der Analyse von Log-Einträge mit Zeitangabe (timestamp), sollte man sich an das Idiom gewöhnen
- Aussuche der interessante Einträge mit grep
- Nutzung von sed mit einem geeigneten regulären Ausdruck, um das unmittelbar interessante Muster herauszuschneiden
- Nutzung von uniq -c um das Vorkommen des interessanten Musters zu zählen

Popcorn, Nachos und Code!
Hamburg 29. und 30. September 2016 – code.talks
code.talks

Post

Posted by Donnerstag, der 18. August 2016

Hinterlasse eine Antwort

No Comments

appMotivate bietet

  • Consulting
  • Konzipierung
  • Projektmanagement
  • Programmierung

Letzter Blog-Artikel