Filtern Sie Protokolldateieinträge basierend auf dem Datumsbereich
Mein server ist mit ungewöhnlich hohen CPU-Auslastung, und ich kann sehen, Apache ist mit viel zu viel Speicher.
Ich habe das Gefühl, ich bin DOS würde von einer einzigen IP-Adresse - vielleicht können Sie mir helfen, ihn finden?
Habe ich die folgende Zeile zu finden, die 10 die meisten "aktiven" IPs:
cat access.log | awk '{print $1}' |sort |uniq -c |sort -n |tail
Den top 5 IPs haben etwa 200 mal so viele Anfragen an den server, die als "Durchschnittliche" Benutzer. Jedoch kann ich nicht herausfinden, ob diese 5 sind nur sehr häufige Besucher, oder Sie sind Angriffe auf die Server.
Ist es Weg, Angabe der oben genannten Suche nach einem Zeit Intervall, zB. die letzten zwei Stunden ODER zwischen 10-12 heute?
Prost!
AKTUALISIERT 23 OKT 2011 - die Befehle, Die ich brauchte:
Holen Sie Einträge innerhalb der letzten X Stunden [Hier zwei Stunden]
awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date) print Date FS $4}' access.log
Bekommen die meisten aktiven IP-Adressen, die innerhalb der letzten X Stunden [Hier zwei Stunden]
awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date) print $1}' access.log | sort |uniq -c |sort -n | tail
Bekommen, Einträge in relativer Zeitspanne
awk -vDate=`date -d'now-4 hours' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date && $4 < Date2) print Date FS Date2 FS $4}' access.log
Bekommen Einträge in die absolute Zeitspanne
awk -vDate=`date -d '13:20' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'13:30' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date && $4 < Date2) print $0}' access.log
Bekommen die meisten aktiven IP-Adressen in absolute Zeitspanne
awk -vDate=`date -d '13:20' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'13:30' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date && $4 < Date2) print $1}' access.log | sort |uniq -c |sort -n | tail
InformationsquelleAutor der Frage sqren | 2011-10-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
ja, es gibt mehrere Möglichkeiten, dies zu tun. Hier ist, wie ich gehen würde, über diese. Für den Anfang, keine Notwendigkeit, leiten Sie die Ausgabe von cat, öffnen Sie einfach die log-Datei mit
awk
.vorausgesetzt, dein log sieht aus wie meins (Sie sind konfigurierbar) als Datum gespeichert ist, die in Feld 4. und ist eingeklammert. Was ich mache, der oben zu finden, ist alles innerhalb der letzten 2 Stunden.
Note the -d'now-2 hours'
oder wortwörtlich übersetzt jetzt minus 2 Stunden, was für mich so aussieht:[10/Oct/2011:08:55:23
Also, was ich mache, ist die Speicherung der formatierte Wert von zwei Stunden und der Vergleich gegen das Feld vier. Der bedingte Ausdruck sollte unkompliziert sein.Ich bin dann drucken Sie das Datum, gefolgt von der Ausgabe Feld-Trennzeichen (OFS-oder-Raum in diesem Fall), gefolgt von die ganze Zeile $0. Sie können Ihre vorherigen Ausdruck und nur print $1 (ip-Adressen)
Wenn Sie wollten, verwenden Sie eine Palette angeben, die zwei Datums-Variablen und bauen Ihre Ausdrucks angemessen.
also, wenn Sie wollten etwas finden, zwischen 2-4 Stunden vor Ihrem Ausdruck könnte wie folgt aussieht
Hier ist eine Frage, die ich beantwortet in Bezug auf Termine, in der bash, die Sie hilfreich finden könnte.
Druck-Datum für den Montag der aktuellen Woche (in der bash)
InformationsquelleAutor der Antwort matchew
Wenn jemand die Begegnung mit der
awk: invalid -v option
hier ist ein Skript, um die meisten aktiven IP-Adressen in einem vordefinierten Zeitraum:InformationsquelleAutor der Antwort Szántó Zoltán
Da dies ein gemeinsamen perl Aufgabe
Ist und weil das ist nicht genau dasselbe, als extrahiert die letzten 10 Minuten vom logfile wo es sich um einen Haufen Zeit bis zum Ende des logfile.
Und da habe ich Sie brauchte, ich (schnell) schrieb:
Dies könnte verwendet werden, wie:
für das drucken von Protokollen zwischen 09h18 und 09h24.
für den Druck von
january 23th, 9h18'12"
bis jetzt.Zur Verringerung perl-code, die ich verwendet habe
-s
Schalter erlauben die automatische Zuordnung von Variablen von der Kommandozeile:-s=09:18
füllt eine variable$s
wich enthalten09:18
. Pflege, um nicht zu verpassen die Gleichheitszeichen=
und keine Leerzeichen!Nota: Diese halten zwei diffent Art von regex für zwei verschiedene Protokoll-standard. Wenn Sie benötigen verschiedene Datum/Zeit-format Parsen, entweder posten Sie Ihre eigenen regex oder nach einer Probe mit formatiertem Datum von Ihrem logfile
InformationsquelleAutor der Antwort F. Hauri