In Logdatei nur die 3 neuesten Einträge zulassen
Ted
- perl
Hallo,
nun grübel ich schon den ganzen Tag lang, aber ich komm nicht drauf.
Ich möchte eine Logdatei beschreiben und auslesen (weis ich, wie geht).
Die Zeilen sehen in etwa so aus:
Name124JahreKoblenz55555
Name223JahreBerlin11111
usw.
Meine Frage:
Wie schaffe ich es, daß immer nur die 3 aktuellsten Einträge in der Logdatei stehen bleiben, d.h. ab dem 4. Eintrag bei jedem neuen Eintrag, der älteste wieder gelöscht wird?
Vielen Dank für Eure Tips
Ted
Hi,
Wie schaffe ich es, daß immer nur die 3 aktuellsten Einträge in der Logdatei stehen bleiben, d.h. ab dem 4. Eintrag bei jedem neuen Eintrag, der älteste wieder gelöscht wird?
komplette Datei einlesen und nur die neuesten drei Einträge (inkl. dem neu hinzukommenden) wieder zurückschreiben. Dein Filesystem kennt keine Magie.
Cheatah
Hi,
Wie schaffe ich es, daß immer nur die 3 aktuellsten Einträge in der Logdatei stehen bleiben, d.h. ab dem 4. Eintrag bei jedem neuen Eintrag, der älteste wieder gelöscht wird?
komplette Datei einlesen und nur die neuesten drei Einträge (inkl. dem neu hinzukommenden) wieder zurückschreiben. Dein Filesystem kennt keine Magie.
Cheatah
Hi Cheatah,
und woran erkenne ich die 3 neuesten?
Danke erstmal
Ted
Hi,
und woran erkenne ich die 3 neuesten?
entweder daran, daß Du das Datum mitspeicherst, oder daran, daß es die drei letzten sind. Das ist ja in Arrays zum Glück nicht sooo schwer herauszufinden :-)
Cheatah
Hi,
könnte es so klappen?
&Lock("lock.file");
open (LOG, "</usr/local/httpd/cgi-bin/datei.txt");
@loglines = <LOG>;
close (LOG);
&Unlock("lock.file");
unshift (@loglines, "$LOGLine")
&Lock("lock.file");
open (LOG, ">/usr/local/httpd/cgi-bin/datei.txt");
$Zähler=0;
foreach (@loglines) {
$Zähler++;
print LOG ("$_\n");
if ($Zähler == 3) {
last;
} #End if $Zähler
} #End foreach
close (LOG);
&Unlock("lock.file");
Und immer daran denken:
Jeder fing mal an ;-)
Ted
Hi,
könnte es so klappen?
*örgs* weiß ich nicht, der Code ist mir zu umständlich.
open (LOG, '/usr/local/httpd/cgi-bin/datei.txt') or die "Kann datei.txt nicht oeffnen: $!";
my @loglines = <LOG>;
close (LOG);
my $new_logline = "Die neue Zeile\n";
open (LOG, '>/usr/local/httpd/cgi-bin/datei.txt') or die "Kann datei.txt nicht schreiben: $!";
print LOG $loglines[-2], $loglines[-1], $new_logline;
close (LOG) or die "Kann datei.txt nicht schliessen: $!";
Ungetestet.
Cheatah
Hi,
könnte es so klappen?
*örgs* weiß ich nicht, der Code ist mir zu umständlich.
open (LOG, '/usr/local/httpd/cgi-bin/datei.txt') or die "Kann datei.txt nicht oeffnen: $!";
my @loglines = <LOG>;
close (LOG);
my $new_logline = "Die neue Zeile\n";
open (LOG, '>/usr/local/httpd/cgi-bin/datei.txt') or die "Kann datei.txt nicht schreiben: $!";
print LOG $loglines[-2], $loglines[-1], $new_logline;
close (LOG) or die "Kann datei.txt nicht schliessen: $!";Ungetestet.
Cheatah
Hi Cheatah,
hm, achso, mit -2, oder -1 kann ich die hinteren Elemente einer Liste ansprechen?
Dank Dir, ich werde es testen und geb Bescheid, obs klappt.
Ted
P.S.: Wieder was gelernt! :-)
Hi,
hm, achso, mit -2, oder -1 kann ich die hinteren Elemente einer Liste ansprechen?
ja; aber ohne das hättest Du nur $listenlaenge-1 und $listenlaenge-2 nehmen müssen. Die Zahl der Elemente eines @array erhält man mit scalar @array.
Cheatah
Hi,
hm, achso, mit -2, oder -1 kann ich die hinteren Elemente einer Liste ansprechen?
ja; aber ohne das hättest Du nur $listenlaenge-1 und $listenlaenge-2 nehmen müssen. Die Zahl der Elemente eines @array erhält man mit scalar @array.
Cheatah
Wußt ich auch nicht.
Also,ich habs getestet und ansich lauft es prima, nur das das script die 3 Einträge hintereinander, anstelle mit Zeilenumbruch untereinander.
Also hab ich schnell anstelle:
print LOG $loglines[-2], $loglines[-1], $new_logline;
print LOG $loglines[-2]\n$loglines[-1]\n$new_logline;\n;
eingetragen.
und: DENKSTE!
Skript läuft nicht mehr.
Kanst Du mir sagen, warum?
Ted
Hi,
hm, achso, mit -2, oder -1 kann ich die hinteren Elemente einer Liste ansprechen?
ja; aber ohne das hättest Du nur $listenlaenge-1 und $listenlaenge-2 nehmen müssen. Die Zahl der Elemente eines @array erhält man mit scalar @array.
Cheatah
Wußt ich auch nicht.
Also,ich habs getestet und ansich lauft es prima, nur das das script die 3 Einträge hintereinander, anstelle mit Zeilenumbruch untereinander.
Also hab ich schnell anstelle:
print LOG $loglines[-2], $loglines[-1], $new_logline;
print LOG $loglines[-2]\n$loglines[-1]\n$new_logline;\n;
eingetragen.
und: DENKSTE!
Skript läuft nicht mehr.
Kanst Du mir sagen, warum?
Ted
Hallo Cheatah,
Probleme gelöst!
Ich habe die Syntax in Bezug auf \n geändert, danach noch beim Einlesen mikt chomp den Zeilenumbruch entfern (weil ansonsten Leerzeilen entstanden), danach lief es perfekt.
Danke für Deine Hilfe!
Ted
Hi,
Ich habe die Syntax in Bezug auf \n geändert, danach noch beim Einlesen mikt chomp den Zeilenumbruch entfern (weil ansonsten Leerzeilen entstanden), danach lief es perfekt.
tja. Hättest Du die chomp-erei einfach gelassen, hätte es die richtigen Zeilenumbrüche von Haus aus gegeben - nicht zu viel und nicht zu wenig ;-)
Cheatah
Hi,
Ich habe die Syntax in Bezug auf \n geändert, danach noch beim Einlesen mikt chomp den Zeilenumbruch entfern (weil ansonsten Leerzeilen entstanden), danach lief es perfekt.
tja. Hättest Du die chomp-erei einfach gelassen, hätte es die richtigen Zeilenumbrüche von Haus aus gegeben - nicht zu viel und nicht zu wenig ;-)
Cheatah
Echt?? Ich lach mich schlapp.
Oh Mann, hab wieder viel gelernt heute.
Danke
Ted