2010-10-15 15 views
7

Quiero redireccionar los mensajes die a un archivo separado para poder comparar ese archivo más adelante y determinar qué salió mal.¿Cómo puedo redirigir la salida de la función a un archivo en Perl?

Pero 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. 
$ 

que no quieren hacer un 2> de la persona que llama. ¿Hay alguna forma de redirigirlos desde el script?

Respuesta

9

Perl die imprime a STDERR para que usted podría redirigir STDERR a un archivo.

#!/usr/bin/env perl 
# the path above depends on your system 

open(STDERR, ">>", "errlog.log"); 
die "Hello"; 
+1

Esto también redirige los mensajes warn(), las advertencias y cualquier otra cosa impresa a STDERR. No solo eso, si alguien ha hecho esto correctamente redefiniendo el manejador __DIE__, es posible que ni siquiera redirija los mensajes die(). –

12

Puede instalar un controlador $SIG{__DIE__} que se ejecutará justo antes de que se ejecute el "dado". 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   
}; 

Ver $SIG{expr} en perlvar para más detalles.

+0

+1, mucho mejor/más flexible que mi método. – birryree

9

El módulo Log::Log4perl ofrece más que unas pocas opciones.

Se puede elegir enviar el mensaje de error a STDERR y al 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; 

pesar de que requiere un poco más de esfuerzo en términos de configuración, su flexibilidad desbloquea una gran cantidad de potencial.

Cuestiones relacionadas