Leser: 26
2010-02-06T13:15:04 reneeZeig mal etwas Code...
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";
1 2 3 4 5 6 7 8
use strict; use warnings; sub fehlersub { my $bar = shift; my $foo; $bar += $foo; } return 1;
my $size = (stat('/home/meinpfad/logs/error.log'))[7] or die "$!";
2010-02-06T15:43:57 GwenDragonWas passiert, wenn duzur Abfrage der Dateigröße verwendest?Code: (dl )my $size = (stat('/home/meinpfad/logs/error.log'))[7] or die "$!";
2010-02-06T16:02:52 pqes gibt keine garantie, wann ein fehler genau im errorlog landet.
pack mal ein sleep vor das zweite -z, dann solltest du den unterschied sehen.
2010-02-06T16:02:52 pqwenn du es unbedingt brauchst, solltest du den signalhandler $SIG{__WARN__} manipulieren.
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 ...; }
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";
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.
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";
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
2010-02-06T18:01:10 pqin 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 { ... }
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; }
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; }
2010-02-06T16:06:26 GwenDragonWeiß du wie das geht?
1 2 3 4 5 6 7 8 9
BEGIN { open (STDERR, '>>', 'meinelogdatei_fuer_dieses_skript'); } # hier dein Code des Skripts END { close (STDERR); }
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
2010-02-06T16:19:42 sid burnVon 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.
2010-02-06T16:30:38 sid burnIch weiß ja nicht was du genau tuen möchtest. Das heißt was du logisch tuen möchtest.
QuoteEs geht darum, im Rahmen der Entwicklung/des Codings Fehler sofort zu erkennen.
use CGI::Carp qw(fatalsToBrowser);
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.
/
2010-02-06T18:13:24 biancaVorschlag: "error.log des Apache während Scriptablauf"
2010-02-06T12:52:19 biancaHabe 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
2010-02-06T12:52:19 bianca- Hauptprogramm schaut, ob !-z error.log; Bedingung ist false
2010-02-28T16:39:43 EscapeEs erscheint ziemlich verwegen, die Lauffähigkeit eines Programms vom Zustand der Datei error.log abhängig zu machen.