Wed 21 Jan 2009
Fortgeschrittenes awk für die Logs-Analyse
Posted by Alrond | Tags: hosting : iptables : Linux : nginx : server :
Ich benutze gern tab in logs als Separator. Das macht die Analyse mit solchen tools als awk wirklich viel leichter.
Für diese Aufgabe benutze ich also nen kleinen Script awkt.
Das Befehlformat ist:
1,2 usw. - die Spaltennummer in der Logs-Zeile, die man ausgeben möchte
Das Logs-Format für Nginx sieht bei mir so aus:
Wenn so:
Es ist möglich, blitzschnell folgendes durchzuführen:
Für diese Aufgabe benutze ich also nen kleinen Script awkt.
Das Befehlformat ist:
awkt [s] [1] [2] ...s - optionaler Parameter, rechnet, sortiert und löscht identische Zeilen
1,2 usw. - die Spaltennummer in der Logs-Zeile, die man ausgeben möchte
Das Logs-Format für Nginx sieht bei mir so aus:
log_format main '$remote_addr $geo "$remote_user" [$time_local] ' '"$request" $status $bytes_sent ' '$backend $upstream_response_time "$http_referer" ' '"$http_user_agent" $gzip_ratio';Die Daten treffen über pipe ein. Der Befehl ist:
cat access.log | awkt 5 6gibt zwei Spalten mit der Anfrage ($request) und dem Statuscode ($status) aus.
Wenn so:
cat access.log | awkt s 9 5dann kann man die Verteilung der Generierungszeit nach gefragten Seiten sehen.
Es ist möglich, blitzschnell folgendes durchzuführen:
- die Verteilung der Anfragen nach Länder
cat access.log | awkt s 2
Als Beispiel, das Ergebnis:
[skip] 276 ES 321 IT 463 UA 502 GB 510 FR 1025 SE 1303 NL 1904 RU 3598 DE 21472 US - die Menge der Anfragen, die dem backend übergeben oder von statischem Cache abgegeben wurde ($backend)
cat access.log | awkt s 8
Das Ergebnis:
13670 0 20767 1
- die Menge der Anfragen von einer IP-Adresse mit User-Agent zusammen
cat access.log | awkt s 1 11
Das Ergebnis:
[skip] 353 208.36.144.9 "Mozilla/5.0 (Twiceler-0.9 http://www.cuil. com/twiceler/robot.html)" 473 67.195.37.108 "Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)" 694 67.195.37.108 "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)" 976 78.46.75.108 "Mozilla/5.0 (compatible; heritrix/${pom. version} +http://seekda.com)" 1700 66.249.71.47 "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 1720 66.249.71.46 "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 1769 66.249.71.45 "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 3084 66.150.96.121 "FeedBurner/1.0 (http://www.FeedBurner.com)"Die Bots sind selbstverständlich auf dem ersten Platz :)
Wenn man es mit anderen Befehlen verbindet, ist möglich einen "Beobachter" in cron zu stellen und besonders freche Benutzer in iptables zu blockieren (klar, ausgeschlossen Google usw.)
tail -n 1000 access.log | grep -v -E "FeedBurner|Yahoo|Google| msnbot|Yandex" | awkt s 1 | awk '{if($1 > 100) print $2}' | while read ip; do iptables -A INPUT -s $ip -j TARPIT; done;(wenn Ihr iptables keinen Modul TRAPIT enthält, kann man einfachen DROP nehmen)
P.S. in solchen Fällen lieber limit_req_zone, limit_conn, limit_zone selbst in Nginx oder limit in iptables benutzen
- Generierungszeit
cat access.log | awkt s 9
Das Ergebnis:
[skip] 409 0.003 474 0.009 491 0.047 648 0.045 697 0.044 770 0.010 837 0.024 1112 0.001 1258 0.043 1908 0.002 13952 -So kann man dann ein Diagramm bauen:
cat access.log | awkt 9 | sort | uniq -c
Wenn man es mit $request verbindet, kann man feststellen, welche Seiten langsam sind:
cat access.log | awkt 9 5 | sort -n
Das Ergebnis:
[skip] 0.947 "POST /XXX HTTP/1.1" 0.948 "GET /XXX HTTP/1.1" 1.064 "GET /XXX HTTP/1.1" 1.153 "POST /XXX HTTP/1.0" 1.161 "GET /XXX HTTP/1.1"
- Die Seiten, die am meisten angefragt werden
cat wipmania.log | awkt s 5
Das Ergebnis:
[skip] 548 "GET /XXX HTTP/1.1" 628 "GET / HTTP/1.0" 736 "GET /XXX HTTP/1.1" 860 "GET /XXX HTTP/1.1" 1244 "GET /XXX HTTP/1.1" 1687 "GET / HTTP/1.1" - Welche Web-Seite hat am meisten Traffic gegeben
cat wipmania.log | awkt s 10
Das Ergbenis:
[skip] 442 "http://www.A.com/A" 459 "http://www.B.com/B" 708 "http://www.C.com/C" 760 "http://www.D.com/D" 25338 "-"
English
Deutsch

May 27th, 2009 at 10:43 a.m.
А мне возможностей awstats хватает. Такое можно сделать в качестве тренировки.