Log4perl es una gran herramienta para el registro.¿Cómo puedo detectar las advertencias de Perl en los registros de Log4perl?
El pragma warnings es también una herramienta esencial.
Sin embargo, cuando las secuencias de comandos de Perl se ejecutan como daemons, las advertencias de Perl se imprimen en STDERR donde nadie puede verlas, y no en el archivo de registro Log4perl del programa correspondiente.
¿Hay alguna forma de detectar las advertencias de Perl en el log Log4perl?
Por ejemplo, este código registrará muy bien para el archivo de registro, pero en caso de que esto se ejecuta como un demonio, las advertencias de Perl se no se incluirán en el 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;
impresiones Esto todavía fuera de STDERR:
"my" variable $foo masks earlier declaration in same scope at log.pl line 27.
Y el archivo de registro no capta esta advertencia.
La advertencia que ve es una advertencia del compilador. Establezca el controlador '$ SIG {__ WARN __}' en un bloque BEGIN: 'my $ logger; COMIENZO {$ logger = get_logger ('Foo :: Bar'); $ SIG {__ WARN__} = sub {$ logger-> warn ("WARN @_"); ' – daotoad
¡Correcto! Gracias a todos por las respuestas, usando el manejador $ SIG {__ WARN__} en un bloque BEGIN es el truco, detecta todas las advertencias, incluidas las advertencias de tiempo de compilación. – Freddie
Podrías haber aceptado la respuesta que decía :) –