Ted: In Logdatei nur die 3 neuesten Einträge zulassen

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

  1. 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

    1. 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

      1. 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

        1. 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

          1. 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

            1. 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! :-)

              1. 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

                1. 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

                  1. 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

                    1. 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

                      1. 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