Schrift
[thread]6708[/thread]

STDOUT umleiten: zur Compile-/Runtime in Log umleiten (Seite 2)

Leser: 2


<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten
GwenDragon
 2005-02-15 17:57
#51741 #51741
User since
2005-01-17
14607 Artikel
Admin1
[Homepage]
user image
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl -w

$| = 1;
use strict;
use warnings;

BEGIN {
    open( STDERR, ">> stderr.log");
}

sub DaKommt
der Fehlerhfate Code ödäää?

END{
    close( STDERR );
}
1;


Quote
_*_LINE_*_ und _*_FILE_*_ und _*_PACKAGE_*_ (jeweils ohne Sternchen) gibts zumindestens
Auch das ist mir geläufig. Irgendwie denke ich gerade zu komplex. Zuviiele Bäume vorm Wald!

Ja, nur wie bringe ich das dann nach STDERR?

Das o. g. Skript soll ein ein Skript sein, das per SetHandler andere Skripte aufruft!\n\n

<!--EDIT|GwenDragon|1108483246-->
Crian
 2005-02-15 18:01
#51742 #51742
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
hmmmm.... wieso ist denn Dein Code eigentlich so fehlerhaft?

Ich weiß nicht, ob jetzt Comilier-Fehler an dieses umgeswitchte STDERR gehen, ich hoffte es eigentlich. Tun sie es nicht?

Hast Du dieses fatals to browser Zeug gesetzt, oder bin ich gedanklich auf dem falschen Pferd?\n\n

<!--EDIT|Crian|1108483430-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
GwenDragon
 2005-02-15 18:08
#51743 #51743
User since
2005-01-17
14607 Artikel
Admin1
[Homepage]
user image
[quote=Crian,15.02.2005, 17:01][/quote]
Quote
hmmmm.... wieso ist denn Dein Code eigentlich so fehlerhaft?

Der Code ist nicht so fehlerhaft. Ich muß nur selbst Module einbinden, weiß aber nicht, ob's das Skript immer fehlerfrei klappt.

Quote
Ich weiß nicht, ob jetzt Comilier-Fehler an dieses umgeswitchte STDERR gehen, ich hoffte es eigentlich. Tun sie es nicht?
Ja.

Quote
Hast Du dieses fatals to browser Zeug gesetzt, oder bin ich gedanklich auf dem falschen Pferd?
Total falscher Gaul ;)


Ich werde erst mal jetzt testen und mich nochmals melden. Danke.
GwenDragon
 2005-02-15 18:32
#51744 #51744
User since
2005-01-17
14607 Artikel
Admin1
[Homepage]
user image
Mist, die durch mein Skript aufgerufenen Skripte schreiben Fehler NICHT zum umgeleiteten STDERR, erzeugen aber auch keinen Server Error 500er-Fehler.

Mal sehen, ob ich bei HTML-Mason selbst noch was finde.\n\n

<!--EDIT|GwenDragon|1108485269-->
Strat
 2005-02-15 19:38
#51745 #51745
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich verwende (gerade zum entwickeln komplexerer sachen) gerne den backtracking-codeschnipsel, den ich auf meiner HP unter Perl -> Tips&Tricks -> Perl-Enhanced -> Backtracking stehen habe... zusaetzlich binde ich die "Signalhandler" _ _SIGDIE_ _ und _ _SIGWARN_ _ (ohne leerzeichen), z.B.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$SIG{_ _WARN_ _} = \&SigWarn; # ohne leerzeichen zw _ _
...
sub SigWarn {
   print "-" x 60, "\n";
   print @_;
   print "\nBacktracking:\n";

   my $count = 1;
   while ($count > -1) {
    my ($package, $filename, $line, $sub) = caller($count);
    last unless defined $line;
    printf("%02i %5i %-20s %-20s\n", $count++, $line, $sub, $filename);
   } # while


} # SigWarn

und noch sowas aehnliches fuer die, dann sehe ich, wie es zu der stelle kam, an der ein die oder warn abgesetzt wurde...
und die prints noch in eine datei schreiben lassen, fertig ist der rubbish lister...\n\n

<!--EDIT|Strat|1108489192-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
ptk
 2005-02-15 20:37
#51746 #51746
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Wobei SIG DIE sehr vorsichtig verwendet werden muss. Ansonsten wird der SIG-Handler auch dann gefeuert, wenn man es gar nicht will, z.B. in eval { ... }-Bloecken. Man schaue sich das folgende Beispiel an:
Code: (dl )
1
2
3
4
5
6
7
$SIG{_ _ DIE _ _} = sub {
#return if $^S;
print "@_";
exit;
};

eval { require JGgrghreioge };

Abhilfe hier waere die Abfrage von $^S (abgebrochenes eval?) oder indem man
Code: (dl )
eval { local $SIG{_ _ DIE _ _ }; .... }

schreibt.
coax
 2005-02-15 20:44
#51747 #51747
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Mit CGI::Carp und der carpout()-Methode kannst du Fehlermeldungen in eine Logdatei umleiten.

Du kannst die Fehlermeldungen aber auch durch erneutes oeffnen von STDERR abfangen und so in eine Datei umleiten:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
  BEGIN {
     my $logfile = 'error_log';
     open(LOG, '>>', $logfile) or die $!;
 
     my $fno = fileno(LOG); # Filenumber der Logdatei
         
     open(STDERR, ">&$fno") # STDERR nun auf den Kanal mit der Nummer $fno umgeleitet
     or print LOG "can't redirect STDERR to $logfile\n";
 }

 die "boeser Fehler!\n"

So (aber viel besser) macht es CGI::Carp auch.

Grusz Christian.
,,Das perlt aber heute wieder...'' -- Dittsche
GwenDragon
 2005-02-15 20:51
#51748 #51748
User since
2005-01-17
14607 Artikel
Admin1
[Homepage]
user image
Auf die Signale bin ich in der Zwischenzeit auch gekommen, bevor ich nochmals bei euch nachgeschaut habe.

Sicher blöd ist die Geschichte bei eval. Es gibt Module, die, wenn das eval fehlschlägt, die reine Perl-Version einbinden anstatt des XS-Moduls. Davon habe ich auch zwei Module List::Util und Params::Validate.
Aber egal, ich weiß ja woher die Fehler kommen.

Ich habe folgenden Code eingebunden ;)
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
BEGIN {

    sub wahn {
        open( F, ">> wahn.log" ); # ;)
        truncate( F, 0 ) if ( (stat( F ))[7] > 1024*1024 ); # > 1 MByte
        flock( F, 2 );
        my $s = localtime;
        print F $s; 
        print F ' [WARN]';
        foreach (@_) { print F " $_" }
        print F "\n";
        close ( F );
    }

    sub dai {
        open( F, ">> wahn.log" );
        truncate( F, 0 ) if ( (stat( F ))[7] > 1024*1024 ); # > 1 MByte
        flock( F, 2 );
        my $s = localtime;
        print F $s; 
        print F ' [DIE]';
        foreach (@_) { print F " $_" }
        print F "\n";
        close ( F );
    }

    $SIG{_ _DIE_ _} = \&dai;
    $SIG{_ _WARN_ _} = \&wahn;
}
GwenDragon
 2005-02-15 20:56
#51749 #51749
User since
2005-01-17
14607 Artikel
Admin1
[Homepage]
user image
[quote=coax,15.02.2005, 19:44]Mit CGI::Carp und der carpout()-Methode kannst du Fehlermeldungen in eine Logdatei umleiten.

So (aber viel besser) macht es CGI::Carp auch.[/quote]
Ja, CGI::Carp ist mir kein Rätsel. ;)

Es gilt: Völker (und ProgrammiererInnen) hört die Signale.
Manchmal stellt sich eine einfach an. Und findet trotzdem die Lösung :)
GwenDragon
 2005-02-15 21:01
#51750 #51750
User since
2005-01-17
14607 Artikel
Admin1
[Homepage]
user image
So, danke für die Lösungen, die ich auch fand.
Aber ich habe gemerkt, dass HTML::Mason selbst die Sigs verbiegt. Die kann ich damit dann doch nicht abfangen und deswegen kommt beim Setzen der Fehlermeldungen auf fatal nix mehr bei meiner Logdatei an.
Ein Redirect für Signale gibts wohl kaum in Perl.

Hilft wohl nur, ein eigenes Modul ein zu setzen und HTML::Mason zu patchen. :angry:\n\n

<!--EDIT|GwenDragon|1108494223-->
<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten



View all threads created 2005-02-15 17:19.