ubuntuusers.de

bash-script: Logfile filtern

Status: Ungelöst | Ubuntu-Version: Ubuntu 11.10 (Oneiric Ocelot)
Antworten |

Arny80Hexa

Avatar von Arny80Hexa

Anmeldungsdatum:
29. Juli 2011

Beiträge: 96

Hallo liebe Community,

kurze Frage, schnelle Antwort:

Ich möchte mir ein Nagios-Skript schreiben, welches das catalina.out des tomcat7 nach auflaufenden ERRORs durchforstet. allerdings möchte ich das immer nur für den Zeitraum der letzten Stunde haben. Wie bekomme ich also das logfile so gefiltert, das nur Einträge innerhalb der letzten Stunde ausgegeben werden!?

Beispielausgabe catalina.out

1
2
3
4
5
2012-05-24 10:50:30,836 INFO   PerformanceLoggerService - Thu May 24 10:50:30 CEST 2012,deliverAd.index,4,135,16,68,33.75
2012-05-24 10:50:30,837 INFO   PerformanceLoggerService - Thu May 24 10:50:30 CEST 2012,Total,16614,325413,4,350,19.5866738895
2012-05-24 10:55:03,940 ERROR  PlayerController - Unknown client video (id:40000281653)
2012-05-24 10:55:30,835 INFO   PerformanceLoggerService - Date,Request,Count,Total Duration,Min Duration,Max Duration,Avg Duration
2012-05-24 10:55:30,836 INFO   PerformanceLoggerService - Thu May 24 10:55:30 CEST 2012,player.playerLog,11034,183946,6,268,16.6708355991

Danke und liebe Grüße, Christoph

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4534

Quick 'n' dirty:

$ cat file.txt 
2012-05-24 10:50:30,836 INFO   PerformanceLoggerService - Thu May 24 10:50:30 CEST 2012,deliverAd.index,4,135,16,68,33.75
2012-05-24 10:50:30,837 INFO   PerformanceLoggerService - Thu May 24 10:50:30 CEST 2012,Total,16614,325413,4,350,19.5866738895
2012-05-24 10:55:03,940 ERROR  PlayerController - Unknown client video (id:40000281653)
2012-05-24 10:55:30,835 INFO   PerformanceLoggerService - Date,Request,Count,Total Duration,Min Duration,Max Duration,Avg Duration
2012-05-24 10:55:30,836 INFO   PerformanceLoggerService - Thu May 24 10:55:30 CEST 
2012,player.playerLog,11034,183946,6,268,16.6708355991

$ grep -e "$(date --date='1 hour ago' +'%F %H')" file.txt | grep ERROR 
2012-05-24 10:55:03,940 ERROR  PlayerController - Unknown client video (id:40000281653)

Edit: moment, quatsch, das filtert nur alles eine Stunde vor der jetzigen ☹ aber als Anfang evtl brauchbar

Edit2: jetzige und letzte Stunde:

$ grep -e "$(date --date='1 hour ago' +'%F %H')" -e "$(date +'%F %H')" file.txt | grep ERROR 

Wenn noch genauer, also genau die letzten 60 min, bin ich grade überfragt ☹

Arny80Hexa

(Themenstarter)
Avatar von Arny80Hexa

Anmeldungsdatum:
29. Juli 2011

Beiträge: 96

Hey vielen Dank, das hat bestens funktioniert! ☺

Arny80Hexa

(Themenstarter)
Avatar von Arny80Hexa

Anmeldungsdatum:
29. Juli 2011

Beiträge: 96

Also hab gerade bemerkt, dass es doch ganz praktisch wäre, wenn ich den Zeitraum Minutenweise angeben kann. also dass ich auch nur die letzten 25 Minuten nehmen kann. Jemand eine Idee?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13213

Arny80Hexa schrieb:

Also hab gerade bemerkt, dass es doch ganz praktisch wäre, wenn ich den Zeitraum Minutenweise angeben kann. also dass ich auch nur die letzten 25 Minuten nehmen kann. Jemand eine Idee?

Ach komm, das ist doch jetzt keine so große Übertragungsleistung. Außerdem gibt's doch noch man date.

Ciao

robert

Arny80Hexa

(Themenstarter)
Avatar von Arny80Hexa

Anmeldungsdatum:
29. Juli 2011

Beiträge: 96

Ja habs in der Zwischenzeit nun auch raus bekommen:

Für die letzten 17 Minuten:

1
grep -e "$(date --date='17 minutes ago' +'%F %H:%M')" -e "$(date +'%F %H:%M')" /var/log/tomcat7/catalina.out | grep ERROR

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4534

Arny80Hexa schrieb:

Für die letzten 17 Minuten:

1
grep -e "$(date --date='17 minutes ago' +'%F %H:%M')" -e "$(date +'%F %H:%M')" /var/log/tomcat7/catalina.out | grep ERROR

leider nein. Das zeigt nur alle ERROR vor genau 17 Minuten und in der jetzigen Minute, nicht auch die dazwischen.

Arny80Hexa

(Themenstarter)
Avatar von Arny80Hexa

Anmeldungsdatum:
29. Juli 2011

Beiträge: 96

Antiqua schrieb:

leider nein. Das zeigt nur alle ERROR vor genau 17 Minuten und in der jetzigen Minute, nicht auch die dazwischen.

Echt, hatte ich noch gar nicht bemerkt. Konnte aber vorhin an der Stelle noch nicht wirklich weiter machen, da leider etwas anderes dazwischen gekommen ist. Ich schau mir das Morgen noch einmal genauer an.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

  1. Zwei greps hintereinander zu pipen ist unschön. Besser wäre es, einen Befehl zu verwenden, der mehrstufig filtern kann.

  2. Der Befehl sed kennt Adressbereiche (von .. bis): sed "$(date --date='17 minutes ago' +'%F %H:%M'),$"

Mit sed lassen sich diese beiden Punkten vereinigen:

sed -n "/^$(date --date='17 minutes ago' +'%F %H:%M')/,$ {/ERROR/p}"  /var/log/tomcat7/catalina.out

Das setzt allerdings voraus, dass die konkrete Minute tatsächlich wenigstens einmal im Log erscheint, sonst greift der Filter nicht.
(dann müsste man einen echten numerischen Vergleich bemühen !)

LG,

track

Antworten |