Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7907[/thread]

"rotate" von einer log-datei



<< |< 1 2 3 >| >> 28 Einträge, 3 Seiten
Arach
 2006-04-20 11:05
#65097 #65097
User since
2006-04-20
11 Artikel
BenutzerIn
[default_avatar]
Hallo.

Erstmal: bin der Stefan und neu hier.

Zweitens: Mein Problem:

Ich bin dabei eine Auswertung für eine fortlaufende Log-Datei zu schreiben.
Funktioniert soweit auch ganz gut.
Nur soll das Ding auf nem Produktiv-Server laufen und sollte deshalb möglichst performant sein.
Um dies zu bewerkstelligen wäre der einfachste weg die Log-Datei von hinten zu durchsuchen, da nur einige wenige Zeilen am Log-Ende relevant sind.
Da das aber nicht geht, soweit ich weiß, wäre der nächste Schritt die Datei zeilenweise umzudrehen (in eine temporäre Datei), um diese dann zu durchsuchen und die Abfrage bei einem bestimmten Timestamp in der Log abzubrechen. Die Original-Log soll ja erhalten bleiben.
Nu meine Frage:
Wie mach ich das?
Ich habe schon versucht mit dem Dateizeiger wieder zur ersten Position zu springen, um dort die jeweilige Zeile einzufügen.
Perl hängt aber immer hinten an, egal wo ich den Zeiger positioniere.
Ich kann auch nicht die gesamte Log in ein Array speichern, da ich so zuviel Speicher reservieren würde.

Wäre extrem nett, wenn ihr irgendwelche Ideen, Lösungen, Vorschläge, etc hättet..

Danke schon mal und Mfg
Stefan
master
 2006-04-20 11:10
#65098 #65098
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Bau doch die Logdatei umgekehrt auf, Aktuellestes immer zuoberst. Dann brauchst Du nur einige Zeilen zu lesen..
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
master
 2006-04-20 11:15
#65099 #65099
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
zeig mal etwas code...
ich vermute du nahmst ">>" statt ">"
Du kannst sonst auch sysopen nutzen...


Quote
Ich kann auch nicht die gesamte Log in ein Array speichern, da ich so zuviel Speicher reservieren würde.

Ja vergiss das mal lieber...

Wie gross ist die Datei?
lieber zeilenweise, oder Byteweise.\n\n

<!--EDIT|master|1145517639-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
Arach
 2006-04-20 11:17
#65100 #65100
User since
2006-04-20
11 Artikel
BenutzerIn
[default_avatar]
Darauf hab ich leider keinen Einfluss.
Bin nur ein dummer Azubi... ;-)
Die Log wird automatisch von ner Transfer-Software für Banken erstellt.
Da kann ich nix machen.

Mfg Stefan

P.S.:
Ich habe es mit ">" probiert. Problem is. er überschreibt immer die erste Zeile. ich hab am Ende nur die letzte zeile in der temp stehen.
Dubu
 2006-04-20 11:22
#65101 #65101
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Dateien liegen auf der Platte im Regelfall sequenziell. Anfügen am Anfang ist deshalb ineffizient, weil jedes Mal die gesamte Restdatei umkopiert werden müsste.

Für das Lesen vom Dateiende empfiehlt sich CPAN:File::ReadBackwards.

Größere Effizienz bringt es vielleicht, einen Prozess permanent das Logfile mitlesen zu lassen und bei einer relevanten Zeile eine entsprechende Aktion auzulösen (z.B. diese Zeile neu in eine separate Datei zu schreiben - locking nicht vergessen).
master
 2006-04-20 11:27
#65102 #65102
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
ok ">" schreibt in die datei... du brauchst nur "<" zum lesen oder?


Ermittle die Grösse... minus die anzahl zeichen die du lesen willst. und lies so die zeichen

1000 = anzahl zeichen
5000 = zeichenoffset

Code: (dl )
1
2
3
4
my $Ausgabe;
open(DATEI, "</log.log");
my $geleseneZeichen = read(DATEI, $Ausgabe, 1000,5000);
close(DATEI);


so kannst du am ende auslesen.

dann kannst du ja den string nach \n splitten.. und du hast wieder die Zeilen... (wobei ev. eine dann unvollständig ist.)
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
master
 2006-04-20 11:29
#65103 #65103
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
@Dubu
jas stimmt.. habe ja selber mal jemandem hier empfohlen besser nur "anzuhängen"...

Besser nur am Ende anhängen und mit offset lesen, oder mit dem Modul.
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
Arach
 2006-04-20 11:37
#65104 #65104
User since
2006-04-20
11 Artikel
BenutzerIn
[default_avatar]
dubu/ Master. Beides schöne Ideen.

Ich muss wohl noch einiges dazu sagen:

Die Zeilen der Log sind nicht immer gleich lang und ich weiss auch nicht wieviele Zeilen/Einträge seit der "letzten" Prüfung hinzugekommen sind.
Desweiteren darf ich auf diesem System keinen permanenten Task laufen lassen.
Die Log is wie folgt aufgebaut:


Quote
Server,22.07.04,15:38:10:0400 Host-Datei: Datei xy wurde &bernommen.
Server,22.07.04,16:08:40:4200 Fehler bei der Host&bernahme, Datei yxx ist doppelt.
Server,22.07.04,16:09:37:8400 Host-Datei: Datei fk wurde &bernommen.
Server,23.07.04,13:08:47:1300 Host-Datei: Datei fj wurde &bernommen.
Server,26.07.04,13:23:56:1500 Host-Datei: Datei fg wurde &bernommen.
Server,26.07.04,15:41:46:1900 Host-Datei: Datei fh wurde &bernommen.
Server,27.07.04,13:14:03:3700 VHoleHostDatei>uebernehmeUms&„tzeAus: Fehler bei Datei ff Satz 35, Ung&ltige SWIFT-Nachricht (2)
Server,27.07.04,13:29:50:7900 Host-Datei: Datei fu wurde &bernommen.


Ich brauche also "<" um die Log zu lesen und "??(bitte einsetzen)" um die temp zu generieren und die zeilen in umgekehrter reihenfolge zu schreiben.
master
 2006-04-20 11:41
#65105 #65105
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Versuch es ohne temp datei zu lösen..
Und nimm das Modul
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
Arach
 2006-04-20 11:47
#65106 #65106
User since
2006-04-20
11 Artikel
BenutzerIn
[default_avatar]
iIch bin grad dabei mir das ganze mal anzuschauen.
Ob ich durchsteig is die andre Frage.
Ich meld mich wenns Neues gibt.

Danke schon mal.
Mfg Stefan
<< |< 1 2 3 >| >> 28 Einträge, 3 Seiten



View all threads created 2006-04-20 11:05.