Möglichkeiten zum Parsen kombinierter NCSA-Protokolldateien

Möglichkeiten zum Parsen kombinierter NCSA-Protokolldateien

Ich habe ein bisschen site:mit Google nach Server Fault, Super User und Stack Overflow gesucht. Ich habe auch nicht sitespezifische Ergebnisse überprüft und eine Frage wie diese nicht wirklich gefunden, also los geht’s …

Ich habe entdecktdiese Frage, bezogen auf grep und awkdas einiges an Wissen enthält, aber ich habe nicht das Gefühl, dass die Herausforderung der Textqualifizierung angesprochen wurde. Diese Frage erweitert den Anwendungsbereich auch auf jede Plattform und jedes Programm.

Ich habe Squid- oder Apache-Protokolle, die auf dem kombinierten NCSA-Format basieren. Wenn ich „basierend“ sage, meine ich, dass die ersten n Spalten in der Datei den kombinierten NCSA-Standards entsprechen. Es können weitere Spalten mit benutzerdefinierten Inhalten vorhanden sein.

Hier ist eine Beispielzeile aus einem kombinierten Squid-Protokoll:

1.1.1.1 - - [11/Dec/2010:03:41:46 -0500] "GET http://yourdomain.com:8080/en/some-page.html HTTP/1.1" 200 2142 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; C) AppleWebKit/532.4 (KHTML, like Gecko)" TCP_MEM_HIT:NONE

Ich möchte nProtokolle analysieren und bestimmte Spalten ausgeben können, zum Sortieren, Zählen, Suchen eindeutiger Werte usw.

Die größte Herausforderung und was es ein wenig knifflig macht und auch, warum ich das Gefühl habe, dass diese Frage noch nicht gestellt oder beantwortet wurde, ist dieTextqualifizierungsrätsel.

Als ich entdeckteasqlvon der Grep/Awk-Frage war ich sehr begeistert, habe dann aber gemerkt, dass die kombinierte Funktion nicht von Haus aus unterstützt wird. Ich denke, ich werde mir eine Erweiterung überlegen.

Ich freue mich auf Antworten und darauf, neue Sachen zu lernen! Antworten müssen nicht auf Plattform oder Programm/Sprache beschränkt sein. Im Kontext dieser Frage sind die Plattformen, die ich am häufigsten verwende, Linux oder OSX.

Prost

Antwort1

Mit Perl, getestet auf v5.10.0, erstellt für Darwin-Thread-Multi-2-Level (OSX)

So drucken Sie die Spalte „UserAgent“:

perl -n -e '/^([^ ]+) ([^ ]+) ([^ ]+) (\[[^\]]+\]) "(.*) (.*) (.*)" ([0-9\-]+) ([0-9\-]+) "(.*)" "(.*)"/; print "$11\n"' -- test.log
  • Option -n, während jede Zeile intest.log
  • Option -eEinzeilenprogramm

Ich habe die Perle, die ich gegoogelt habe, gestohlen und verändert.aus dem PHP-Kochbuch. Ich habe das $am Ende des re entfernt, um benutzerdefinierte Formate basierend auf kombiniertem NCSA zu unterstützen. Das Muster kann leicht erweitert werden, um weitere Gruppen bereitzustellen.

Die regulären Ausdrucksgruppen ()enden als lokale Variablen $1in$n

Schnell und einfach und sehr einfach zu erweitern und zu skripten.

Einige Beispiele für die Weiterleitung der Ausgabe:

  • | sort | uniqeindeutige Spaltenwerte
  • | sort | uniq | wc -lAnzahl eindeutiger Spalten

Kritik und Verbesserungen willkommen

Antwort2

Obwohl es nicht direkt auf die Textqualifizierung eingeht, kann man sich im kombinierten Format einen Vorteil verschaffen: Die verbleibenden durch Leerzeichen getrennten Spalten befinden sich immer in derselben Spalte. Sie können das Problem daher umgehen, indem Sie eine Schleife mit printf und NF (Anzahl der Spalten) verwenden.

Laut awk ist $0 die gesamte Eingabezeile, $1 die erste Spalte, $2 die zweite und $NF die letzte.

Für einen kombinierten Standard-NCSA umfasst der Benutzeragent also die Spalten $13 bis $NF.

Ich musste die erste Spalte entfernen und sie mit der letzten Spalte eines geänderten Protokollformats ersetzen (die Proxy-IP wurde der letzten Spalte hinzugefügt).

Was also zurückgegeben werden sollte, war die Spalte $NF, gefolgt von der zweiten Spalte ($2) und dann die restlichen Spalten bis NF - 1

Das konnte ich folgendermaßen erreichen: -

awk '{ printf "%s ", $NF; for (i=2; i<=NF-1; i++) printf "%s ", $i; printf "\n";}' < /var/log/nginx/access.log

verwandte Informationen