Schrift
[thread]8490[/thread]

Log Handler und mehr: STDOUT, STDERR, warnings umleiten

Leser: 2


<< >> 6 Einträge, 1 Seite
bloonix
 2006-11-10 10:00
#71614 #71614
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo Community,

leider werde ich nicht fündig. Ich suche nach einem Modul, welches mir
nicht nur die Arbeit abnimmt, Logfiles zu schreiben, sondern auch
die Ausgabekanäle und die Signalhandler __DIE__ und __WARN__ umleiten
kann. Logfiles sollen im typischen Format

Datum Zeit Meldung

geschrieben werden. Zwar habe ich schon einige nette Module zum Log-
handling gefunden, aber nichts, was halt etwas mehr kann. Nach einem
"Close" soll natürlich der vorherige Stand wiederhergestellt werden.

Gruss,
opi
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2006-11-10 11:17
#71615 #71615
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Also CPAN:Log::Log4perl schaut ja ganz nett aus,
aber die Fails fuer Windows sind nicht so toll.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2006-11-13 11:02
#71616 #71616
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Moin zusammen,

warum wird hier die Fehlermeldung nicht an &_die_handler uebergeben?

(gekürztes Package)
Code: (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
30
31
32
package Handler;

use strict;
use warnings;
use Fcntl qw(:DEFAULT :flock);
use IO::Handle;
use Data::Dumper;

my $opts = {
  filename => './foo.bar',
  mode => O_WRONLY | O_APPEND | O_CREAT,
  umask => 0640,
};

my $self = bless $opts, __PACKAGE__;

open my $olderr, ">&STDERR" or die $!;
$self->{olderr} = \$olderr;
sysopen(STDERR, $self->{filename}, $self->{mode}, $self->{umask}) or die $!;
$self->{fh} = \*STDERR;
$self->{olddie} = $SIG{__DIE__};
$SIG{__DIE__} = \&_die_handler("bar foo");
STDERR->autoflush(1);

sub _die_handler {
  print {$self->{fh}} Dumper(\@_);
  exit(9);
}

1;

die "foo bar";


$ cat foo.bar

$VAR1 = [
         'bar foo'
       ];


Es wird zwar bar foo an die Funktion uebergeben, aber nicht die
Fehlermeldung, die mit die "foo bar" uebergeben werden sollte.
Wenn ich einfach nur $SIG{__DIE__} = \&_die_handler; uebergebe,
dann wird zwar die DIE-Meldung uebergeben, aber ich moechte gerne
etwas mehr an die Routine uebergeben.

Gruss,
opi\n\n

<!--EDIT|opi|1163409178-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
pq
 2006-11-13 11:32
#71617 #71617
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=opi,13.11.2006, 10:02]
Code: (dl )
1
2
3
4
5
6
$SIG{__DIE__} = \&_die_handler("bar foo");
...
sub _die_handler {
  print {$self->{fh}} Dumper(\@_);
  exit(9);
}
[/quote]
$SIG{__DIE__} wird nie gesetzt. es wird die funktion _die_handler
aufgerufen und das ergebnis zugewiesen, aber durch das exit() kommt
es nie zur zuweisung.
normalerweise weist man hier eine subref zu.

z.b.:
$SIG{__DIE__} = sub { _die_handler(@_, "bar foo") };\n\n

<!--EDIT|pq|1163410416-->
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 & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
bloonix
 2006-11-13 11:55
#71618 #71618
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
@tinita

Ich dachte, dass mit

$SIG{__DIE__} = \&_die_handler($self);

eine Subref uebergeben wird, so wie mit

$SIG{__DIE__} = \&_die_handler;

Das die Routine ausgefuehrt wird, damit hab ich nicht gerechnet. Mit

$SIG{__DIE__} = sub { _die_handler(@_, "bar foo") };

funktioniert es! Danke!\n\n

<!--EDIT|opi|1163412033-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
renee
 2006-11-13 13:07
#71619 #71619
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Nein, durch die () wird der Aufruf der Methode forciert.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl

use strict;
use warnings;

my $sample = \&test();

sub test{
print "Hallo\n";
}

Code: (dl )
1
2
~/entwicklung 343> perl coderef.pl 
Hallo
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 6 Einträge, 1 Seite



View all threads created 2006-11-10 10:00.