Log4perl è un ottimo strumento per la registrazione.Come posso catturare gli avvisi Perl nei log di Log4perl?
Il pragma warnings è anche uno strumento essenziale.
Tuttavia, quando gli script Perl sono in esecuzione come daemon, gli avvisi Perl vengono stampati in STDERR dove nessuno può vederli e non nel file di log Log4perl del programma in questione.
C'è un modo per catturare gli avvisi Perl nel log di Log4perl?
Ad esempio, questo codice sarà il login bene nel file di registro, ma nel caso in cui questo viene eseguito come un demone, gli avvertimenti Perl saranno non essere inclusi nel registro:
#!/usr/bin/env perl
use strict;
use warnings;
use Log::Log4perl qw(get_logger);
# Define configuration
my $conf = q(
log4perl.logger = DEBUG, FileApp
log4perl.appender.FileApp = Log::Log4perl::Appender::File
log4perl.appender.FileApp.filename = test.log
log4perl.appender.FileApp.layout = PatternLayout
);
# Initialize logging behaviour
Log::Log4perl->init(\$conf);
# Obtain a logger instance
my $logger = get_logger("Foo::Bar");
$logger->error("Oh my, an error!");
$SIG{__WARN__} = sub {
#local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1;
$logger->warn("WARN @_");
};
my $foo = 100;
my $foo = 44;
stampe questa immagine Ancora out to STDERR:
"my" variable $foo masks earlier declaration in same scope at log.pl line 27.
E il file di registro non rileva questo avviso.
L'avviso visualizzato è un avviso del compilatore. Imposta il gestore '$ SIG {__ WARN __}' in un blocco BEGIN: 'my $ logger; INIZIA {$ logger = get_logger ('Foo :: Bar'); $ SIG {__ WARN__} = sub {$ logger-> warn ("WARN @_"); ' – daotoad
Giusto! Grazie a tutti per le risposte, l'utilizzo del gestore $ SIG {__ WARN__} in un blocco BEGIN fa il trucco, cattura tutti gli avvertimenti, inclusi gli avvisi di compilazione. – Freddie
Avresti potuto accettare la risposta che diceva :) –