Eine Sache, die ich aus Gründen, die ich mir nicht vorstellen kann, noch nie von einem anderen gesehen habe, ist, das Apache-Protokolldateiformat auf eine einfacher zu analysierende Version mit den Informationen zu ändern, die für Sie tatsächlich von Bedeutung sind.
Beispielsweise verwenden wir niemals die HTTP-Basisauthentifizierung, sodass wir diese Felder nicht protokollieren müssen. Ich interessiere mich dafür, wie lange die Bearbeitung einer Anfrage dauert, daher werden wir dies hinzufügen. Bei einem Projekt möchten wir auch wissen (auf unserem Load Balancer), ob Server Anfragen langsamer als andere bedienen, daher protokollieren wir den Namen des Servers, zu dem wir zurückkehren.
Hier ist ein Auszug aus der Apache-Konfiguration eines Servers:
# We don't want to log bots, they're our friends
BrowserMatch Pingdom.com robot
# Custom log format, for testing
#
# date proto ipaddr status time req referer user-agent
LogFormat "%{%F %T}t %p %a %>s %D %r %{Referer}i %{User-agent}i" standard
CustomLog /var/log/apache2/access.log standard env=!robot
Was Sie nicht wirklich erkennen können, ist, dass zwischen jedem Feld ein literales Tabulatorzeichen (\ t) steht. Das bedeutet, dass ich Folgendes tun kann, wenn ich in Python einige Analysen durchführen möchte und beispielsweise Statuswerte anzeigen möchte, die nicht 200 sind:
for line in file("access.log"):
line = line.split("\t")
if line[3] != "200":
print line
Oder wenn ich machen wollte 'wer verbindet Bilder?' es wäre
if line[6] in ("","-") and "/images" in line[5]:
Für IP-Zählungen in einem Zugriffsprotokoll das vorherige Beispiel:
grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" logfile | sort -n | uniq -c | sort -n
wird so etwas:
cut -f 3 log | uniq -c | sort -n
Leichter zu lesen und zu verstehen und weitaus weniger rechenintensiv (kein regulärer Ausdruck), was bei 9-GB-Protokollen einen großen Unterschied in der Zeitdauer macht. Wenn dies WIRKLICH ordentlich wird, ist es, wenn Sie dasselbe für Benutzeragenten tun möchten. Wenn Ihre Protokolle durch Leerzeichen getrennt sind, müssen Sie einige reguläre Ausdrücke abgleichen oder Zeichenfolgen manuell suchen. Mit diesem Format ist es einfach:
cut -f 8 log | uniq -c | sort -n
Genau das gleiche wie oben. Tatsächlich ist jede Zusammenfassung, die Sie machen möchten, im Wesentlichen genau dieselbe.
Warum um alles in der Welt würde ich die CPU meines Systems für awk ausgeben und grep, wenn cut genau das macht, was ich um Größenordnungen schneller will?