Apache logs nach Zugriffen pro Zeit auswerten

4 (80%) 1 vote

Problem: Anzahl der Requests pro Zeit aus Apache-Logs extrahieren

Lösung: Bash-Zauber

cat access.log | awk  '{print $4,$5;}' | sed 's/[\[/:]/ /g' | sed 's/\]//g' | sort | uniq -c -w #LESEN#

Was macht er da ? Einfach mehrere der Bashcommandos mit Pipe (|) aneinander hängen und dadurch die Augsgabe als Eingabe zum nächsten weiterreichen. Das ganze funktioniert wie ein Baukasten und ist universell einsetzbar.

cat access.log # ausgabe des Logfiles
 
awk  '{print $4,$5;}' # extrahieren der uhrzeit aus dem Log
 
sed 's/[\[/:]/ /g' | sed 's/\]//g'  # Uhrzeit von [ und ] formatierungen bereinigen
 
# sortiert nach zahlen - in dem Fall nach der Uhrzeit. 
# Das sortieren an der Stelle ist wichtig, da uniq nur aufeinanderfolgende Dubletten erkennt. 
# Ohne sortierung ist das sort Ergebnis falsch.
sort 
 
# Alle die bis einschließlich 19ten Stelle gleichen Strings werden als Dublette erkannt und gezählt. 
# Die 19te Stelle ist : Richtig, die Minuten.
uniq -c -w 19 
 
#  Alle die bis einschließlich 15ten Stelle gleichen Strings werden als Dublette erkannt und gezählt. 
# Die 19te Stelle ist : Richtig, die Stunden.
uniq -c -w 55 
 
# Alle die bis einschließlich 12ten Stelle gleichen Strings werden als Dublette erkannt und gezählt. 
# Die 15te Stelle ist : Richtig, das Datum (also nach Tagen).
uniq -c -w 12

Testen der Auswertung.

Durch cat wird das ganze Log ausgegeben (zcat für comprimierte) – das kann zu debuggen der Auswertung nervig sein – ich kenne Logbücher mit einigen GB pro Tag. Deswegen legt man sich ein kurzes mit 100 Zeilen (oder nach belieben weniger mit )

head -n 1000 access.log

zurecht legen.

Beispiel 1. Auswerung nach Tagen

cat tobiasfischer_access.log | awk  '{print $4,$5;}' | sed 's/[\[/:]/ /g' | sed 's/\]//g'  |  uniq -c -w 12
 
2190  07 Apr 2015 00 01 31 +0200
738  08 Apr 2015 00 04 20 +0200
683  09 Apr 2015 00 04 20 +0200
651  10 Apr 2015 00 04 20 +0200
844  11 Apr 2015 00 04 20 +0200
720  12 Apr 2015 00 04 20 +0200
759  13 Apr 2015 00 04 20 +0200
880  14 Apr 2015 00 04 20 +0200
1398  15 Apr 2015 00 04 20 +0200
899  16 Apr 2015 00 04 20 +0200
789  17 Apr 2015 00 04 20 +0200
774  18 Apr 2015 00 07 20 +0200
686  19 Apr 2015 00 07 20 +0200
930  20 Apr 2015 00 00 20 +0200
761  21 Apr 2015 00 00 20 +0200
780  22 Apr 2015 00 00 20 +0200
993  23 Apr 2015 00 00 20 +0200
942  24 Apr 2015 00 00 20 +0200
1031  25 Apr 2015 00 00 20 +0200
727  26 Apr 2015 00 00 20 +0200
664  27 Apr 2015 00 00 20 +0200
893  28 Apr 2015 00 00 20 +0200
626  29 Apr 2015 00 00 20 +0200
776  30 Apr 2015 00 00 20 +0200
772  01 May 2015 00 03 20 +0200
891  02 May 2015 00 03 20 +0200
923  03 May 2015 00 03 20 +0200
708  04 May 2015 00 03 20 +0200
718  05 May 2015 00 06 20 +0200

Beispiel 2. Auswertung nach Stunden auf Tage

cat tobiasfischer_access.log | awk  '{print $4,$5;}' | sed 's/[\[/:]/ /g' | sed 's/\]//g'  |  uniq -c -w 19
 
2  07 May 2015 08 37 46 +0200
2  07 May 2015 08 41 20 +0200
38  07 May 2015 08 43 31 +0200
2  07 May 2015 08 47 46 +0200
2  07 May 2015 08 51 20 +0200
2  07 May 2015 08 57 46 +0200
2  07 May 2015 09 01 20 +0200
17  07 May 2015 09 04 18 +0200

Beispiel 3. Auswertung eines Stundenprofiles für mehrere Tage (Wann dürfen wir Deployen ? Wann die Server ohne Ärger restarten ?

Uniq ist es letztendlich egal was es uniq macht – es vergleicht aus Zeichen oder Zahlenebene. Deswegen kann man durch beschneiden der Zeitangabe das Datum entfernen und dann nur noch auf die Zeit sortieren. mit cut erreicht man dies sehr elegant.

cut -c 14-19 # nach Stunden/Minuten
 
cut -c 14-17 # nach Stunden/10 Minuten
 
cut -c 14-15 # nach Stunden
 
head -n 1 tobiasfischer_access.log | awk  '{print $4,$5;}' | sed 's/[\[/:]/ /g' | sed 's/\]//g'  |  cut -c 14-19
 
13 38
13 38
13 38
13 39
13 39
cat tobiasfischer_access.log | awk  '{print $4,$5;}' | sed 's/[\[/:]/ /g' | sed 's/\]//g'  |  cut -c 14-15 |  sort  | uniq -c
3684 00
3608 01
3229 02
3147 03
3096 04
2995 05
3041 06
3588 07
5284 08
12807 09
18005 10
14023 11
7268 12
10045 13
8711 14
12424 15
8418 16
7618 17
7031 18
5913 19
5559 20
8490 21
6501 22
3485 23

Wenn man nun noch Die Stunden und Zähler drehen möchte …. | awk ‚{print $2,$1}‘ anhängen. Dann das ganze in Excel kopieren und managementtauglich verschönern.

oder z.B. alle Seitenabrufe (nicht Requests!) alle Requests eliminieren die nur Elemente der Seite sind.

 | egrep -v '.css|.js|.jpeg|.jpg|.png|.gif|.woff|ajax.php|wp-cron.php|wp-admin|sitemap.*.xml|xmlrpc.php|robots.txt|favicon.ico|POST|HEAD'

nach dem cat einfügen. Es lassen sich so beliebige Auswertungen fahren.

 

2 comments

Kommentar verfassen

Sie können die folgenden HTML-Codes verwenden:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Leider ist CAPTCHA notwendig .... *