Font

Warnungen des Programms überwachen und ins error.log des Apache schreiben

[thread]14596[/thread]


hide all open all
Subtrees:
Vorschlag tail -f oder CGI::Carp ( article) 2010-03-07 02:32
Vorschlag mit eval ( article) 2010-03-07 02:29
  • close +55 replies
  • close close bianca  2010-02-06 13:52 #131916 #131916
    User since
    2009-09-13
    1810 articles

    user image  
    Habe folgenden Ablauf:
    - Hauptprogramm required ein anderes script und ruft darin eine sub auf
    - sub erzeugt einen typischen Fehler Use of uninitialized value
    - Hauptprogramm schaut, ob !-z error.log; Bedingung ist false

    Kann es sein, dass der Webserver das error.log erst schreibt/schließt, wenn das Hauptprogramm beendet ist?
    Gibt es eine Möglichkeit, wie das Hauptprogramm sofort nach Ausführung der sub im required Script erkennt, ob da was ins error.log kommen wird?

    danke
    10 print "Hallo"
    20 goto 10
    • close +6 replies
    • close close renee  2010-02-06 14:15 #131918 #131918
      User since
      2003-08-04
      13296 articles
      [Homepage]
      [default_avatar]  
      Normalerweise wird das gleich in das error.log geschrieben. Lässt sich gut mit "tail -f error.log" beobachten.

      Zeig mal etwas Code...
      • close +5 replies
      • close close bianca  2010-02-06 14:39 #131921 #131921
        User since
        2009-09-13
        1810 articles

        user image  
        2010-02-06T13:15:04 renee
        Zeig mal etwas Code...


        test1.pl:
        Code (perl):
        1
        2
        3
        4
        5
        6
        7
        8
        9
        
        #!/usr/bin/perl -w
        $| = 1;
        use strict;
        use warnings;
        my $error_vorher = (!-z '/home/meinpfad/logs/error.log' ? 'EINTRAG' : 'leer');
        require 'test2.pl';
        &fehlersub ('foo');
        my $error_nachher = (!-z '/home/meinpfad/logs/error.log' ? 'EINTRAG' : 'leer');
        print "Content-Type: text/plain\n\nHallo!<br>vorher: $error_vorher<br>nachher: $error_nachher";


        test2.pl:
        Code (perl):
        1
        2
        3
        4
        5
        6
        7
        8
        
        use strict;
        use warnings;
        sub fehlersub {
                my $bar = shift;
                my $foo;
                $bar += $foo;
        }
        return 1;


        Ergebnis beim ersten Aufruf:
        Code:
        1
        2
        3
        Hallo!
        vorher: leer
        nachher: leer


        Beim zweiten Aufruf erst:
        Code:
        1
        2
        3
        Hallo!
        vorher: EINTRAG
        nachher: EINTRAG


        Woran liegt das?
        Ich hätte gern NACH Aufruf von &fehlersub bereits das !-z mit true beantwortet :)

        Edit: Typo
        Last edited: 2010-02-06 14:50:56 +01:00
        10 print "Hallo"
        20 goto 10
        • close +4 replies
        • close close GwenDragon  2010-02-06 16:43 #131927 #131927
          User since
          2005-01-17
          6207 articles
          [Homepage]

          user image  
          Vielleicht Zugriffsprobleme?
          Ich weiß gerade nicht ob -z intern stat verwendet.
          Deswegen teste mal folgendes.

          Was passiert, wenn du
          Code:
          my $size = (stat('/home/meinpfad/logs/error.log'))[7] or die "$!";
          zur Abfrage der Dateigröße verwendest?
          • close +3 replies
          • close close bianca  2010-02-06 16:56 #131928 #131928
            User since
            2009-09-13
            1810 articles

            user image  
            2010-02-06T15:43:57 GwenDragon
            Was passiert, wenn du
            Code:
            my $size = (stat('/home/meinpfad/logs/error.log'))[7] or die "$!";
            zur Abfrage der Dateigröße verwendest?

            Es verhält sich exakt genau so unerwünscht wie mein vorheriges !-z
            Was mich an Deiner Frage wundert: Ist das bei Dir denn anders als bei mir? Oder aus Zeitgründen nicht selbst lokal nachgestellt?
            Bei mir ist das Verhalten mit Perl, v5.8.7 built for MSWin32-x86-multi-thread (=ActivePerl mit XP) identisch zu Perl, v5.8.5 built for i686-linux auf einem Linux Host.
            Apache ist auch gleich konfiguriert.
            10 print "Hallo"
            20 goto 10
            • close +2 replies
            • close close GwenDragon  2010-02-06 17:02 #131929 #131929
              User since
              2005-01-17
              6207 articles
              [Homepage]

              user image  
              Ich kann es auf meinem Linux-Server nicht nachstellen, da Serverlogs und Skript unter verschiedenen UID auf Grund von su_exec laufen.
              //EDIT: Dort läuft Perl 5.8.8.

              Auf meinem lokalen Windows 7 (64bit) mit Perl 5.8.9 kann ich dein Problem nicht nachvollziehen.
              Bei mir kommt immer:

              Hallo!
              vorher: leer
              nachher: EINTRAG

              Last edited: 2010-02-06 17:04:47 +01:00
              • close pq  2010-02-06 17:05 #131931 #131931
                User since
                2003-08-04
                8330 articles
                [Homepage]

                user image  
                ich kann es nachvollziehen und durch ein sleep vor dem zweiten -z beeinflussen.
                Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
                lesen: Wiki:Wie frage ich & Perldoc:perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
    • close GwenDragon  2010-02-06 14:23 #131920 #131920
      User since
      2005-01-17
      6207 articles
      [Homepage]

      user image  
      Ist die Ausgabepufferung auch ausgeschaltet? Oder ist STDERR in Perl nicht gepuffert? Natürlich ist der Fehlerkanal niemals gepuffert. *doh*
      Last edited: 2010-02-06 14:26:22 +01:00
    • close +11 replies
    • close close pq  2010-02-06 17:02 #131930 #131930
      User since
      2003-08-04
      8330 articles
      [Homepage]

      user image  
      es gibt keine garantie, wann ein fehler genau im errorlog landet.
      pack mal ein sleep vor das zweite -z, dann solltest du den unterschied sehen.
      es handelt sich hier um zwei prozesse. nicht das script schreibt was ins errorlog, sondern der apache (oder welcher webserver auch immer).
      daher überschneiden sich der aufruf des -z und das schreiben ins log. meist ist das script einfach schneller.

      vermutlich ist das hier sowieso ein XY-problem. ich habe es noch nie gebraucht, in echtzeit auf das errorlog zugreifen zu müssen. wenn du es unbedingt brauchst, solltest du den signalhandler $SIG{__WARN__} manipulieren.
      Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
      lesen: Wiki:Wie frage ich & Perldoc:perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
      • close +10 replies
      • close close bianca  2010-02-06 17:07 #131934 #131934
        User since
        2009-09-13
        1810 articles

        user image  
        2010-02-06T16:02:52 pq
        es gibt keine garantie, wann ein fehler genau im errorlog landet.
        pack mal ein sleep vor das zweite -z, dann solltest du den unterschied sehen.

        Selbst ein sleep 5; ändert garnichts.

        2010-02-06T16:02:52 pq
        wenn du es unbedingt brauchst, solltest du den signalhandler $SIG{__WARN__} manipulieren.

        Wie genau geht man da vor?

        EDIT: Auf Linux klappt es mit sleep! Nur unter XP lokal nicht.
        Last edited: 2010-02-06 17:17:48 +01:00
        10 print "Hallo"
        20 goto 10
        • close +9 replies
        • close close pq  2010-02-06 17:08 #131936 #131936
          User since
          2003-08-04
          8330 articles
          [Homepage]

          user image  
          perldoc -f warn

          edit: -f
          Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
          lesen: Wiki:Wie frage ich & Perldoc:perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
          • close +8 replies
          • close close bianca  2010-02-06 17:11 #131937 #131937
            User since
            2009-09-13
            1810 articles

            user image  
            Wärst Du so nett und würdest das eingebaut in meinen Code einmal beispielhaft zeigen?
            10 print "Hallo"
            20 goto 10
            • close +7 replies
            • close close pq  2010-02-06 17:38 #131948 #131948
              User since
              2003-08-04
              8330 articles
              [Homepage]

              user image  
              ich versteh nicht, wo das problem liegt. da steht ja ein beispiel in der doku.
              Code (perl):
              1
              2
              3
              4
              5
              6
              7
              
              {
                  local $SIG{__WARN__} = sub {
                      # tu, was auch immer du mit der warnung tun möchtest
                      $got_warning = $_[0];
                  };
                  require ...;
              }
              Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
              lesen: Wiki:Wie frage ich & Perldoc:perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
              • close +6 replies
              • close close bianca  2010-02-06 18:12 #131964 #131964
                User since
                2009-09-13
                1810 articles

                user image  
                Das ist mal richtig geil!

                test1.pl sieht nun so aus:
                Code (perl):
                1
                2
                3
                4
                5
                6
                7
                8
                9
                10
                11
                12
                13
                
                #!/usr/bin/perl -w
                $| = 1;
                use strict;
                use warnings;
                print "Content-Type: text/html\n\nHallo!<br><br>";
                my @error;
                local $SIG{__WARN__} = sub {
                        push @error,shift;
                };
                print "Vorher: @error<br>\n";
                require 'test2.pl';
                &fehlersub ('foo');
                print "Nachher: @error<br>\n";


                Und tatsächlich:
                Code:
                1
                2
                3
                4
                Hallo!

                Vorher:
                Nachher: Use of uninitialized value in addition (+) at test2.pl line 6. Argument "foo" isn't numeric in addition (+) at test2.pl line 6.


                Jetzt muss ich das zu revisionszwecken nur noch parallel ins error.log printen und fertig.
                Super!
                Danke Euch allen! *bussi*
                10 print "Hallo"
                20 goto 10
                • close +5 replies
                • close close bianca  2010-02-06 18:47 #131968 #131968
                  User since
                  2009-09-13
                  1810 articles

                  user image  
                  Hab es jetzt so gelöst:

                  Code (perl):
                  1
                  2
                  3
                  4
                  5
                  6
                  7
                  8
                  9
                  10
                  11
                  12
                  13
                  14
                  15
                  16
                  17
                  18
                  19
                  20
                  21
                  22
                  23
                  
                  #!/usr/bin/perl -w
                  $| = 1;
                  use strict;
                  use warnings;
                  use Fcntl qw(:DEFAULT :flock);
                  my %env = (
                          chmod_dateien => 0666,
                  );
                  print "Content-Type: text/html\n\nHallo!<br><br>";
                  my @errorstack;
                  local $SIG{__WARN__} = sub {
                          (my $error = shift) =~ s/[\r\n]//g;
                          push @errorstack,$error;
                          sysopen (my $errorlog,'errorlog.txt',O_WRONLY|O_APPEND|O_CREAT,$env{chmod_dateien});
                          if ($! eq '') {
                                  print $errorlog '[' . localtime() . '] [error] [client ' . (defined $ENV{'REMOTE_ADDR'} ? $ENV{'REMOTE_ADDR'} : 'n.a.') . '] ' . $error . "\n";
                                  close $errorlog;
                          }
                  };
                  print "Vorher: @errorstack<br>\n";
                  require 'test2.pl';
                  &fehlersub ('foo');
                  print "Nachher: @errorstack<br>\n";


                  Das schreibt den Fehler in die error.log und löst mein Problem.
                  Perfekt!

                  Nochmal Danke!

                  Edit an pq als Wunsch/Request: Jetzt wäre es schön, wenn man diesem Beitrag als Thread-Eröffner das Kennzeichen "Lösung" geben könnte und dadurch dieser Beitrag farblich oder sonstwie kenntlich gemacht würde. Wäre für jemanden, der die Frage liest und das gleiche Problem hat einfacher, sofort die Lösung zu finden.
                  Last edited: 2010-02-06 18:51:59 +01:00
                  10 print "Hallo"
                  20 goto 10
                  • close +3 replies
                  • close close pq  2010-02-06 19:01 #131969 #131969
                    User since
                    2003-08-04
                    8330 articles
                    [Homepage]

                    user image  
                    aus perldoc perlvar:
                    Quote
                    $! If used numerically, yields the current value of the C "errno"
                    variable, or in other words, if a system or library call fails,
                    it sets this variable. This means that the value of $! is
                    meaningful only immediately after a failure


                    in einem erfolgsfall von deinem sysopen kannst du deshalb keine garantie haben, dass $! wirklich leer ist. immer in bedingung mit dem vorherigen funktionsaufruf benutzen. sysopen(...) or do { ... }
                    Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
                    lesen: Wiki:Wie frage ich & Perldoc:perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
                    • close +2 replies
                    • close close bianca  2010-02-06 19:07 #131971 #131971
                      User since
                      2009-09-13
                      1810 articles

                      user image  
                      2010-02-06T18:01:10 pq
                      in einem erfolgsfall von deinem sysopen kannst du deshalb keine garantie haben, dass $! wirklich leer ist. immer in bedingung mit dem vorherigen funktionsaufruf benutzen. sysopen(...) or do { ... }

                      Danke für den Hinweis!
                      Dann also besser so?

                      Code (perl):
                      1
                      2
                      3
                      4
                      5
                      6
                      
                              my $openerr = '';
                              sysopen (my $errorlog,'errorlog.txt',O_WRONLY|O_APPEND|O_CREAT,$env{chmod_dateien}) or $openerr = $!;
                              if ($openerr eq '') {
                                      print $errorlog '[' . localtime() . '] [error] [client ' . (defined $ENV{'REMOTE_ADDR'} ? $ENV{'REMOTE_ADDR'} : 'n.a.') . '] ' . $error . "\n";
                                      close $errorlog;
                              }
                      10 print "Hallo"
                      20 goto 10
                      • close renee  2010-02-06 19:23 #131978 #131978
                        User since
                        2003-08-04
                        13296 articles
                        [Homepage]
                        [default_avatar]  
                        Besser so:

                        Code (perl):
                        1
                        2
                        3
                        4
                        
                                if ( sysopen (my $errorlog,'errorlog.txt',O_WRONLY|O_APPEND|O_CREAT,$env{chmod_dateien}) ) {
                                        print $errorlog '[' . localtime() . '] [error] [client ' . (defined $ENV{'REMOTE_ADDR'} ? $ENV{'REMOTE_ADDR'} : 'n.a.') . '] ' . $error . "\n";
                                        close $errorlog;
                                }
                  • close GwenDragon  2010-02-06 19:42 #131982 #131982
                    User since
                    2005-01-17
                    6207 articles
                    [Homepage]

                    user image  
                    /- Mod GwenDragon:
                    @bianca
                    Es wäre gut gewesen, solche Erweiterungen dort zu diskutieren wo sie hingehören.
                    Unter Requests.

                    Da hätten wir auch den Sinn einer solchen Markierung unter Profis, Semiprofis, Interessierten und Lernenden diskutieren können.

                    In einem Problemlösungsthread finde ist das nicht mehr dem eigentlichen Fragestellung des Threads zugehörig.

                    Bitte mische doch in deinem Beitrag nicht sowas außerhalb des Topics.
                    /

    • close +21 replies
    • close close GwenDragon  2010-02-06 17:06 #131932 #131932
      User since
      2005-01-17
      6207 articles
      [Homepage]

      user image  
      Ich empfehle dir entweder STDERR deiner Skripte umzuleiten in eine eigenen Fehlerdatei oder das Signal WARN selbst zu behandeln.

      Weiß du wie das geht?
      • close +3 replies
      • close close bianca  2010-02-06 17:08 #131935 #131935
        User since
        2009-09-13
        1810 articles

        user image  
        2010-02-06T16:06:26 GwenDragon
        Weiß du wie das geht?

        Nein, wäre für Hilfe dankbar.
        10 print "Hallo"
        20 goto 10
        • close +2 replies
        • close close GwenDragon  2010-02-06 17:27 #131943 #131943
          User since
          2005-01-17
          6207 articles
          [Homepage]

          user image  
          Beispiel für einfache STDERR-Umleitung in Datei:
          Code (perl):
          1
          2
          3
          4
          5
          6
          7
          8
          9
          
          BEGIN {
            open (STDERR, '>>', 'meinelogdatei_fuer_dieses_skript');
          }
          
          # hier dein Code des Skripts
          
          END {
            close (STDERR);
          }


          Allerdings empfehle ich eher ein Modul, das Logs mitschreibt.


          Beispiel für das Abfangen von Warnungen:
          Code (perl):
          1
          2
          3
          4
          5
          6
          7
          8
          
          BEGIN {
            sub MeinWarn {
               # hier dein Code zur Weiterverarbeitung der Warnungen
            }
            $SIG{__WARN__} = \&MeinWarn;
          }
          
          # hier dein Code des Skripts

          • close GwenDragon  2010-02-06 17:37 #131947 #131947
            User since
            2005-01-17
            6207 articles
            [Homepage]

            user image  
            Module für das Loggen von STDERR wären zum Beispiel:
            CPAN:Log-Log4perl oder CPAN:IO-Capture-Stderr

            /Edit: Typo
      • close +17 replies
      • close close sid burn  2010-02-06 17:19 #131939 #131939
        User since
        2006-03-29
        1520 articles

        user image  
        Auch dann muss die ausgabe nicht Synchron sein. Generell wenn mann folgendes hat:

        Code (perl):
        1
        2
        
        print STDOUT "Ausgabe:\n";
        print STDERR "Error\n";


        gibt es keine Garantie das "Ausgabe" zuerst auf STDOUT landet als "Error" in STDERR geschrieben wird. Zwar kann man die Bufferung in Perl deaktivieren, das bedeutet aber nicht das der Rest des Betriebsystems deswegen nicht mehr buffert. Das buffert weiterhin und es kann durchaus sein, das die reihenfolge anders sein wird. Sich darauf verlassen sollte man sich jedenfalls nicht.

        Ansonsten sehe ich das generell häufig wenn ich Test Dateien laufen lasse und dort neben ausgaben noch warnings ausgebe. Teilweise kommen die warnings an stellen in der ausgabe wo man es nicht erwartet.

        Möchte man die Ausgabe Synchron haben ist die absolut einzige Möglichkeit zum gleichen Handle zu schreiben. Zwar gibt es auch hier keine Garantie das es sofort da ist, aber die ausgabe ist ja immer Synchron.

        Gerade deswegen hat auch der Befehl "prove" den Schalter "-m" das STDERR auf STDOUT umleitet. So das die Ausgaben defenitiv Synchron geschehen.

        Von daher ist die Lösung generell zu schauen ob schon etwas ins "error.log" geschrieben wurde und ob ein Fehler vorhanden war einfach ein weg der von sich aus Fehlerbehaftet ist.
        Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
        • close +16 replies
        • close close bianca  2010-02-06 17:22 #131940 #131940
          User since
          2009-09-13
          1810 articles

          user image  
          2010-02-06T16:19:42 sid burn
          Von daher ist die Lösung generell zu schauen ob schon etwas ins "error.log" geschrieben wurde und ob ein Fehler vorhanden war einfach ein weg der von sich aus Fehlerbehaftet ist.

          Und wie würdest Du das lösen?
          10 print "Hallo"
          20 goto 10
          • close +15 replies
          • close close sid burn  2010-02-06 17:30 #131944 #131944
            User since
            2006-03-29
            1520 articles

            user image  
            Ich weiß ja nicht was du genau tuen möchtest. Das heißt was du logisch tuen möchtest.
            Grundsätzlich wenn ein Fehler in einem Programm auftaucht solltest du den Fehler auch in einem Programm abfangen und nicht über seine Logdateien.

            Aber bevor ich dazu mehr schreibe solltest du schreiben was du überhaupt tuen möchtest. Das ist nicht wie du die error.log synchron bekommst oder wie du die größe abfragst, sondern das ist der grund warum du das machst um was genau zu erreichen?
            Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
            • close +14 replies
            • close close bianca  2010-02-06 17:41 #131949 #131949
              User since
              2009-09-13
              1810 articles

              user image  
              2010-02-06T16:30:38 sid burn
              Ich weiß ja nicht was du genau tuen möchtest. Das heißt was du logisch tuen möchtest.

              Es geht darum, im Rahmen der Entwicklung/des Codings Fehler sofort zu erkennen.
              Das mache ich derzeit, indem ich im Programm nach Aufruf der sub auf !-z error.log prüfe und im Falle von true den entspr. Menüpunkt einfärbe. Das hätte ich halt gern schon sofort gewußt und nicht erst beim zweiten Aufruf des Hauptprogramms. Wäre einfach eleganter.

              Kriegsentscheidend und produktiv ist das alles nicht, denn die Fehler finde ich im Rahmen der Entwicklung natürlich trotzdem. Hatte mir halt nur nicht vorgestellt, dass es so kompliziert ist, es sofort zu bekommen, wollte es mir nur angenehmer machen.
              10 print "Hallo"
              20 goto 10
              • close pq  2010-02-06 17:43 #131950 #131950
                close Subtree with 12 replies: Vorschlag tail -f oder CGI::Carp
                User since
                2003-08-04
                8330 articles
                [Homepage]

                user image  
                wie schon gesagt wurde, ein tail -f auf das errorlog sollte in diesem fall ausreichend sein. ohne blick auf das errog arbeitet man ja blind.

                edit:
                und um das rad nicht neu zu erfinden:
                use CGI::Carp qw(fatalsToBrowser warningsToBrowser);

                edit pq: teilbaum ausgelagert
                Last edited: 2010-03-07 02:32:36 +01:00
                Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
                lesen: Wiki:Wie frage ich & Perldoc:perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
              • close sid burn  2010-02-06 19:38 #131981 #131981
                User since
                2006-03-29
                1520 articles

                user image  
                Quote
                Es geht darum, im Rahmen der Entwicklung/des Codings Fehler sofort zu erkennen.

                Geht es um Webentwicklung bei CGI?

                Du kannst dann das Modul "Cgi::Carp" laden. CGI::Carp

                wenn du dann am anfang
                Code (perl):
                use CGI::Carp qw(fatalsToBrowser);


                einbindest werden sämtliche Fehler in deinem Browser präsentiert, und du musst die error.log nicht immer durchgehen. Eventuell gibt es aber mitlerweile bessere Module für CGI. Zumindest finde ich auch das hier:

                CGI::Carp::DebugScreen

                Neue Anwendungen die ich schreibe mache ich eh in Catalyst, dort gibt es dann den StackTrace als Plugin.

                Allerdiengs werden nur richtige Fehler präsentiert, keine warnings.
                Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
    • close +3 replies
    • close close GwenDragon  2010-02-06 19:10 #131973 #131973
      User since
      2005-01-17
      6207 articles
      [Homepage]

      user image  
      /- Mod GwenDragon:
      Ich habe mal den Titel geändert, dass auch Suchende durch den Titel die Aufgabestellung erkennen können.
      /
      • close +2 replies
      • close close bianca  2010-02-06 19:13 #131975 #131975
        User since
        2009-09-13
        1810 articles

        user image  
        2010-02-06T18:10:07 GwenDragon
        /- Mod GwenDragon:
        Ich habe mal den Titel geändert, dass auch Suchende durch den Titel die Aufgabestellung erkennen können.
        /

        Nicht ganz passend. Du hast die Lösung umschrieben aber nicht die Frage.

        Vorschlag: "error.log des Apache während Scriptablauf"
        10 print "Hallo"
        20 goto 10
        • close pq  2010-02-06 19:24 #131979 #131979
          User since
          2003-08-04
          8330 articles
          [Homepage]

          user image  
          2010-02-06T18:13:24 bianca
          Vorschlag: "error.log des Apache während Scriptablauf"

          das wäre wiederum IMHO eine umschreibung einer lösung, du möchtest warnings abfangen. das errorlog ist unabhängig von deinem script eine datei, die vom webserver geschrieben wird.
          ich finde den von GwenDragon ausgesuchten titel ok so.
          Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
          lesen: Wiki:Wie frage ich & Perldoc:perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
    • close bianca  2010-02-28 11:38 #133780 #133780
      User since
      2009-09-13
      1810 articles

      user image  
      Abschließend noch für Interessierte meine jetzige Lösung:

      Ich gebe der Ausgabe an den Browser einen Ajax-Schnipsel mit, der dann nach Seitenaufbau nochmal beim Script fragt, ob die error.log belegt ist. Falls ja, wird eine entsprechende Anzeige auf der Seite gemacht. So ist auch immer gewährleistet, dass die zuvor gelaufene und Fehler produzierende Scriptausführung fertig und somit das error.log geschrieben ist.

      Klappt ganz hervorragend.

      Die Manipulation von $SIG{__WARN__} war eine gute und ebenfalls funktionierende Option, mir aber zu tief eingreifend im Vergleich zur (Un-)wichtigkeit der eigentlichen Anforderung.

      Grüße und schönen Sonntag noch!
      10 print "Hallo"
      20 goto 10
    • close Escape  2010-02-28 15:46 #133786 #133786
      close Subtree with 9 replies: Vorschlag mit eval
      User since
      2008-07-24
      312 articles
      [default_avatar]  
      2010-02-06T12:52:19 bianca
      Habe folgenden Ablauf:
      - Hauptprogramm required ein anderes script und ruft darin eine sub auf
      - sub erzeugt einen typischen Fehler Use of uninitialized value
      - Hauptprogramm schaut, ob !-z error.log; Bedingung ist false

      Kann es sein, dass der Webserver das error.log erst schreibt/schließt, wenn das Hauptprogramm beendet ist?
      Gibt es eine Möglichkeit, wie das Hauptprogramm sofort nach Ausführung der sub im required Script erkennt, ob da was ins error.log kommen wird?

      danke

      Im Hauptprogramm
      Code:
      1
      2
      eval{require "foo.pl"};
      $@ && die $@;

      sollte ausreichend sein.


      mod-edit pq: teilbaum ausgelagert
      Last edited: 2010-03-07 02:29:14 +01:00
      Die Deutsche Rechtschreibung ist Freeware; Du darfst sie kostenlos nutzen – aber sie ist nicht Open Source, d.h. Du darfst sie nicht verändern und/oder in veränderter Form veröffentlichen.
    • close +2 replies
    • close close Escape  2010-02-28 17:39 #133795 #133795
      User since
      2008-07-24
      312 articles
      [default_avatar]  
      2010-02-06T12:52:19 bianca
      - Hauptprogramm schaut, ob !-z error.log; Bedingung ist false

      Es erscheint ziemlich verwegen, die Lauffähigkeit eines Programms vom Zustand der Datei error.log abhängig zu machen.
      Schließlich können auch andere Prozesse in die error.log schreiben und damit den Zustand der Datei verändern.

      Die Deutsche Rechtschreibung ist Freeware; Du darfst sie kostenlos nutzen – aber sie ist nicht Open Source, d.h. Du darfst sie nicht verändern und/oder in veränderter Form veröffentlichen.
      • close bianca  2010-02-28 17:58 #133796 #133796
        User since
        2009-09-13
        1810 articles

        user image  
        2010-02-28T16:39:43 Escape
        Es erscheint ziemlich verwegen, die Lauffähigkeit eines Programms vom Zustand der Datei error.log abhängig zu machen.

        Es geht nicht um irgendwelche Abhängigkeiten.
        Ich will lediglich im Rahmen der Entwicklung an meinem Projekt sofort sehen, wenn nach Ausführung des neuen Programmteils ein error.log Eintrag hängen geblieben ist.
        -w, use strict und use warnings sind bei mir selbstverständlich, daher kommen ab und zu mal ein paar Einträge bei mir während der Entwicklung und die möchte ich sofort sehen. Auf diese Weise erzeuge ich nahezu fehlerfreien Code, zumindest verfolge ich diesen Anspruch ;)
        10 print "Hallo"
        20 goto 10

View all threads created 2010-02-06.

[Powered by Battie]
Powered by Perl
Powered by Pound
Some Icons are from
Fugue Icons
Impressum