Ich kann Protokollanalysatoren verwenden, muss jedoch häufig aktuelle Webprotokolle analysieren, um zu sehen, was gerade passiert.
Ich mache manchmal Dinge wie die Ermittlung der Top-10-IPs, die eine bestimmte Datei anfordern
cat foo.log | grep request_to_file_foo | awk '{print $1}' | sort -n | uniq -c | sort -rn | head
Was hast du in deiner Toolbox?
Antworten:
Mit awk allein können Sie so ziemlich alles mit Apache-Protokolldateien machen. Apache-Protokolldateien sind grundsätzlich durch Leerzeichen getrennt, und Sie können so tun, als ob die Anführungszeichen nicht vorhanden wären, und über die Spaltennummer auf alle gewünschten Informationen zugreifen. Dies funktioniert nur dann, wenn Sie über das kombinierte Protokollformat verfügen und sich für Benutzeragenten interessieren. Zu diesem Zeitpunkt müssen Sie Anführungszeichen (") als Trennzeichen verwenden und einen separaten Befehl awk ausführen. Im Folgenden werden die IPs von aufgeführt Jeder Benutzer, der die Indexseite anfordert, sortiert nach der Anzahl der Treffer:
$ 7 ist die angeforderte URL. Sie können zu Beginn beliebige Bedingungen hinzufügen. Ersetzen Sie die '$ 7 == "/" mit den gewünschten Informationen.
Wenn Sie das $ 1 in (ipcount [$ 1] ++) ersetzen, können Sie die Ergebnisse nach anderen Kriterien gruppieren. Wenn Sie $ 7 verwenden, wird angezeigt, auf welche Seiten wie oft zugegriffen wurde. Dann möchten Sie natürlich zu Beginn den Zustand ändern. Das Folgende würde zeigen, auf welche Seiten ein Benutzer von einer bestimmten IP-Adresse aus zugegriffen hat:
Sie können die Ausgabe auch sortieren, um die Ergebnisse in der richtigen Reihenfolge abzurufen, entweder als Teil des Shell-Befehls oder auch im awk-Skript selbst:
Letzteres wäre nützlich, wenn Sie das awk-Skript erweitern möchten, um andere Informationen auszudrucken. Es ist alles eine Frage dessen, was Sie herausfinden möchten. Diese sollten als Ausgangspunkt für alles dienen, woran Sie interessiert sind.
quelle
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:
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:
Oder wenn ich machen wollte 'wer verbindet Bilder?' es wäre
Für IP-Zählungen in einem Zugriffsprotokoll das vorherige Beispiel:
wird so etwas:
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:
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?
quelle
cut -f 3 log | uniq -c | sort -n
User Agentscut -f 8 log | uniq -c | sort -n
.Vergiss awk und grep. Check out asql . Warum nicht lesbare Skripte schreiben, wenn Sie SQL-ähnliche Syntax zum Abfragen der Protokolldatei verwenden können? Z.B.
quelle
Hier finden Sie ein Skript, mit dem Sie die wichtigsten URLs, Verweise und Benutzereinträge aus den letzten N Protokolleinträgen finden können
Quelle
quelle
Für IP-Zählungen in einem Zugriffsprotokoll:
Es ist ein bisschen hässlich, aber es funktioniert. Ich benutze auch folgendes mit netstat (um aktive Verbindungen zu sehen):
Sie sind einige meiner Lieblings "Einzeiler" :)
quelle
Das Erstellen einer Liste mit häufig gestellten Fragen wäre ein guter Index für diese Antworten auf diese Frage. Meine häufigsten Fragen sind:
Ich bemerke solche Änderungen durch Überwachen der Serverstatus-Seiten (über mod_status) auf die Zugriffsrate und die ungefähre Antwortzeit für aktive und kürzlich abgeschlossene Anforderungen (wohl wissend, dass ich einen großen Datenstapel vermisse, aber Beispiele sind gut genug).
Ich verwende die folgende LogFormat-Direktive (% T ist wirklich nützlich)
Ich suche nach Ursache-Wirkung und was zuerst passiert ist ... normalerweise über bestimmte Untergruppen von Mustern in meinen Protokollen, daher muss ich für ein bestimmtes Muster / einen regulären Ausdruck Folgendes wissen:
Ich benutze normalerweise Perl, weil es mit der Zeit so komplex wird, dass es sich lohnt.
Ein Nicht-Perl-Beispiel wäre eine schnelle Trefferquote pro Minute für Nicht-200-Statuscodes:
Ja, ich betrüge mit diesem Grep und gehe davon aus, dass ein Anführungszeichen-Leerzeichen-200-Leerzeichen nur mit http-Statuscodes übereinstimmt. Sie könnten awk oder perl verwenden, um das Feld zu isolieren.
Ein komplexeres Beispiel in Perl könnte darin bestehen, eine Änderung der Trefferquote für ein Muster zu visualisieren.
In dem folgenden Skript gibt es viel zu kauen, besonders wenn Sie mit Perl nicht vertraut sind.
Code folgt:
Wenn Sie nur Standardmetriken verarbeiten möchten, gehen Sie zur Kasse
quelle
In meinem Beispiel 'sed' liest es das Standardformat von Apache-Protokollen und konvertiert es in etwas, das für die automatische Verarbeitung bequemer ist. Die gesamte Zeile wird als regulärer Ausdruck definiert, Variablen werden gespeichert und mit '#' als Trennzeichen ausgegeben.
Die vereinfachte Notation der Eingabe lautet:% s% s% s [% s] "% s"% s% s "% s" "% s"
Beispiel für eine Eingabezeile: xx.xx.xx.xx - - [29 / Mar / 2011: 12: 33: 02 +0200] "GET /index.html HTTP / 1.0" 200 9443 - "Mozilla / 4.0"
Beispiel für eine Ausgabezeile: xx.xx.xx.xx # - # - # 29 / Mar / 2011: 12: 33: 02 + 0200 # GET /index.html HTTP / 1.0 # 200 # 9443 # - # Mozilla / 4.0
Fühle die Kraft regulärer Ausdrücke :-)
quelle
Ich benutze awk oft, indem ich die Datei beschreibe oder beschreibe. Jede Nacht liefere ich mir einen Webbericht für jeden Server. Abhängig von Ihrer Protokolldatei und Ihrem LogFormat müssen Sie einige der einen Liner bearbeiten, um für Sie zu arbeiten.
Hier ist ein einfaches Beispiel:
Wenn ich die Protokolle auf meinem Server nur auf 404/500 Statuscodes beschränken möchte, gehe ich folgendermaßen vor:
<snip>
</ snip>
quelle
Wer verlinkt deine Bilder ?:
quelle
Meistens lese ich Abschnitte eines Protokolls nach Zeitangaben. Daher habe ich das folgende Skript mit sed geschrieben, um die Zeitspanne, an der ich interessiert bin, zu ermitteln. Es funktioniert für jede Protokolldatei, die ich erhalten habe across und kann auch die archivierten Protokolle verarbeiten.
quelle
Obwohl ich nicht sed oder awk bin, gibt es zwei Dinge, die ich für den Umgang mit Apache- und Icecast-Protokolldateien als nützlich empfunden habe.
AWStats hat ein sehr nützliches Skript namens logresolvemerge.pl , das mehrere komprimierte oder unkomprimierte Protokolldateien kombiniert, Dupes entfernt und nach Zeitstempel sortiert. Es kann auch DNS-Lookups durchführen und so konfiguriert werden, dass Multithreading ausgeführt wird. Es ist besonders nützlich , wenn sie mit awstats verwenden , da awstats nicht Protokollzeilen mit Zeitstempeln älter als die aktuelle Datenbank hinzufügen kann, so dass alles in Ordnung hinzugefügt werden muß, aber das ist sehr einfach , da Sie nur Futter alles bei logresolvemerge.pl und alles erscheint schön aus.
sed und awk sind ziemlich schlecht im Umgang mit Daten, weil sie sie im Allgemeinen als Zeichenfolgen behandeln. awk hat einige Zeit- und Datumsfunktionen, aber sie sind nicht zu viel. Zum Beispiel ist es schwierig, einen Zeilenbereich zwischen zwei Zeitstempeln zu extrahieren, wenn diese genauen Zeitstempel nicht in der Datei vorkommen (auch wenn Werte zwischen ihnen vorkommen) - Chris 'Beispiel hat genau dieses Problem. Um dies zu beheben, habe ich ein PHP-Skript geschrieben , das Zeitstempelbereiche der Protokolldatei meldet und auch einen Block nach Zeitstempelbereich extrahieren kann, wobei ein beliebiges Datums- oder Zeitformat verwendet wird (es muss nicht mit dem Zeitstempelformat der Protokolldatei übereinstimmen).
Um dieses Thema auf dem Laufenden zu halten, folgen einige nützliche Tipps: Ermitteln Sie die Gesamtanzahl der aus Apache- oder Icecast-Protokollen gelieferten Bytes:
Ermitteln Sie die Gesamtanzahl der verbundenen Sekunden aus einem Icecast-Protokoll:
quelle
Nach der Wiederherstellung dieses alten Threads, nachdem ich auf asql für große Protokolldateien verzichtet hatte, suchte ich nach einer Lösung, die auch im Serverfehler steckte. Ich fand , dass wtop hier ein OpenSource-Tool ist, das in der Lage ist, Protokolle live zu überwachen oder zu verarbeiten und Statistiken zu erhalten (oben) N), sehr flexibel und mächtig, der offizielle Ort ist hier
quelle