¿Cómo se puede redirigir la salida de la función que mueren en un archivo en Perl?
Pregunta
Quiero redirigir los mensajes die
en un archivo separado para que pueda comparar ese archivo después para determinar lo que salió mal.
Sin embargo, este código me da errores:
$ cat test.pl
use strict;
use warnings;
my $log = "msglog.log";
die $log "DEAD$!";
$ perl test.pl
Missing comma after first argument to die function at test.pl line 5, near ""DEAD$!";"
Execution of test.pl aborted due to compilation errors.
$
No quiero hacer un 2>
de la persona que llama. ¿Hay alguna manera de los redirige desde el script?
Solución
impresiones die
de Perl a STDERR
por lo que podría redirigir STDERR
en un archivo.
#!/usr/bin/env perl
# the path above depends on your system
open(STDERR, ">>", "errlog.log");
die "Hello";
Otros consejos
Se puede instalar un controlador de $SIG{__DIE__}
que se ejecuta justamente antes de las carreras "morir". El controlador será llamada con el mensaje de error que se puede iniciar la sesión:
local $SIG{__DIE__} = sub {
my ($message) = @_;
# log the message
};
$ SIG {expr} en perlvar para más detalles.
Las ofertas Log::Log4perl
módulo más de unos pocos opciones.
Uno puede optar por la salida del mensaje de error para ambos STDERR y el archivo de registro.
my $logger = Log::Log4perl->init ( 'log.conf' );
# Configuration file controls what to output, like time, line number, class...
$logger->get_logger ( 'Hello::World' ); # Define which class logger to use
.
.
.
open my $fh, '<', $file
or $logger->logdie ( "Log the demise: $!" ); # ... and die;
A pesar de que requiere un poco más de esfuerzo en términos de configuración, su flexibilidad abre un gran potencial.