Log-Datum vergleichen

Hey :smile:,

Ich habe eine Log-Datei in der in jeder Zeile ein Datum für ein bestimmtes Ereignis steht.

Das Programm sollte jeden Tag ausgeführt werden und jeweils die Logs der letzten 24 Stunden in ein File schreiben.

Wie kann ich nun jene Logs in ein Array schreiben die nicht länger als 24h zurückliegen ?

Danke im Vorraus
LG, Stojan

Hallo,

für solche Sachen gibt es „LogRotate“. Es wird in bestimmten Intervallen gestartet und sichert Logfiles, komprimiert sie ggf.und löscht alte Logdateien.

Gruß

Hallo Klaus S.;

die .log-Files werden automatisch erstellt (.log.1 , .log.2 … usw.) sobald sie 10MB überschreiten.

Meine Aufgabe ist es nun die letzten 1-2 Files zu öffnen und nur die Zeilen die max. 24h zurückliegen und für uns von Bedeutung sind rauszulesen und die übrigen zu verwerfen.

Sprich im Klartext habe ich die 10MB file wobei mehr als die Hälfte der Zeilen unwichtig ist. Das rausfiltern der wichtigen Zeilen in eine neue Datei habe ich bereits, nur ist jetzt das Ziel nicht die ganzen 10MB zu filtern sonder nur den Teil der von den letzten 24h Stunden stammt. Ich hoffe das hat das ganze bisschen verdeutlicht :smiley:

LG, Stojan

Dann bleibt nichts anderes als die Files Zeile für Zeile durchzuscannen und das Datum/Zeit abzugleichen.
Ein indizierter Zugriff ist kaum möglich, da die Zeilenlängen mit Sicherheit nicht konstant sind.
Zwar läßt sich auch dort eine „binäre“ Suche etablieren, der Aufwand ist aber auch realtiv hoch

genau darin liegt das Problem.

Wie schaff ich es dass die Zeit bzw. das Datum als Datum gelesen wird und mit der aktuellen Zeit verglichen wird ?

Momentan sieht er die Angabe z.B.: „2013-07-23 14:22:36,644“ ja nur als String an und nicht als Datum bzw. Zeitangabe.

Entweder konvertierst Du die aktuelle Zeit ebenfalls in einen String gleichen Formats und vergleichst die Strings (schlecht, da bei Strings in dem Fall ungünstig) oder Du konververtierst die Angabe aus dem Logfile in einen Zeitwert (z.B. time_t (Sekunden seit 1.1.1970) und vergleichst die mit der aktuellen Zeit - ob der Wert >= aktuelle Zeit minus 86400 [Sekunden]. (besser)
Wie genau Du das konvertierst hängt von der Programmiersprache ab. Viele bieten im API sowas an (string -> timelocal oder struct nach timelocal)

Hallo.

Eigentlich sollte dies doch auch mit einem sed / regulären Ausdruck lösen lassen. Ganz einfach gerade aus:

  1. Aktuelle Zeit bestimmen und damit das Intervall bestimmen.
  2. Datei öffnen und in einen Array schreiben (mittels Filehandler)
  3. Entsprechenden regulären Ausdruck zusammenbauen, der die die letzten 24h fasst (hängt nun eben stark vom Aufbau der Datum / Zeitinformation ab).
  4. Array öffnen, mit regulären Ausdruck und entsprechend sieben und das Ergebnis mittels > oder >> in eine Datei schreiben lassen.

Ggf. kann ich besser helfen, wenn Sie ein paar Besipielzeilen des Logs einmal als Antwort schicken.

Viele Grüße.

Michael, das wären so ein paar Beispielzeilen des Logs

2013-07-21 11:01:22,998 DEBUG [qtp1670151403-142] updateCarData: Received data

2013-07-21 11:01:23,019 DEBUG [qtp1670151403-131] ModemStatusMessage: Received antenna data:

2013-07-21 11:01:46,970 DEBUG [qtp1670151403-116] ModemStatusMessage: Received antenna data:

LG, Stojan

Hallo Stojan,

um ein Datum zu vergleichen brauchst du unbedingt ein Date-Modul, z.B. http://search.cpan.org/~izut/Date-Simple-3.03/lib/Da… - in den Beispielen am Anfang der Seite sind auch Vergleiche mit drin. Problem könnte das Format sein, da musst du wahrscheinlich einen Formatstring der Log-Datei einbasteln.

Ansonsten halt jede Zeile durchlaufen und wenn die Zeit-Bedingung passt in deine Tages-Log-Datei schreiben.

Sorry dass ich so spät antworte - hab derzeit Besuch und nicht so viel Zeit am Rechner. *g*

Viele Grüße
Uwe

Vielen Dank für die Antwort.
Ich werde mir das sofort ansehen und bei eventuellen Unklarheiten eventuell noch mal nachfragen.

LG Stojan

Hallo Uwe,

also momentan steh ich wirklich auf der Leitung was das Thema angeht.

Momentan öffne ich die Logs filtere sie aus und schreibe sie dann in eine neue Datei.

wann genau soll ich jetzt das Datum vergleichen ??

1.) die neue datei öffnen und da filtern

2.) die daten vorher filtern und dann wieder filtern und dann erst reinschreiben

3.) kann ich das in einem machen ? also eine ifelse abfrage oder ist es besser das getrennt zu tun ?

Danke,
Stojan

Du kannst das sehr gut zusammen machen, hier nur das Gerüst für Datei einlesen, Ausgabedatei öffnen und Zeilen schreiben.

Die Vergleichsbedingung musst du dir mit Date::Simple basteln.

Wahrscheinlich musst du zuerst aus der $line den Date-String rausholen - das hängt dann vom genauen Format der Log-Datei ab…

my $in\_filename = "/dir/filename.log";  
my $out\_filename = "/dir/output.log";  
  
local \*INFILE;  
open (INFILE,$in\_filename) or die "input file open error";  
my @content = ; # alle Zeilen einlesen  
close INFILE;  
  
local \*OUTFILE;  
open (OUTFILE,"\>$out\_filename") or die "output file open error";  
  
# alle Zeilen abarbeiten  
foreach my $line (@content) {  
 # jetzt erst mal den Date rausfischen  
 # und in ein Date::Simple packen  
 if (DEINE\_SUPER\_VERGLEICHSBEDINGUNG) {  
 print OUTFILE $line;  
 }  
}  
close OUTFILE;  

Ich hoffe, das hilft dir etwas weiter…
Gruß Uwe

Danke echt super von dir.
das hilft mir um einiges weiter !

lg, Stojan

Hallo.

Wie gesagt, ziemlich straight forward:

Einlesen:

my $datei ="text.txt";  
open (in,"){  
my $date=localtime;  
#print $date;  
if ($\_ =~ m/^(.\*? .\*?),\*$/){  
my $currentdate = $1;  

Dann den String currentdate konvertieren, mit date vergleichen und alles

Hallo,

sorry, aber ich verstehe die Aufgabenstellung leider nicht. Welches Programm soll da ausgeführt werden? Was hat das Programm mit den Logdateien zu tun? In welches Array soll da etwas geschrieben werden? Welche Programmiersprache?

Grüße

Kai

sorry, kann nicht helfen.

die Programmiersprache ist Perl.

Die Aufgabe ist es nun ein Skript zu schreiben das das Log-File öffnet, also Zeilenweise einliest. Danach wird jede Zeile verglichen mit if und entsprechend nur die relevanten Zeilen ausgefiltert sprich ich teile die Zeilen in 2 verschieden Arrays ( @important, @notimportant ) und schreibe dann das Array @important in ein neues File.

Soweit hab ich es, nun wäre eine weitere Aufgabe nur die Zeilen die 24 Stunden oder jünger sind zu lassen und die anderen (älteren) aus der datei zu löschen.

Meine Frage ist nun wie mach ich es das er die Zeilen auf das Datum prüft und mit dem aktuellen überprüft.

Gruß Stojan