¿Cómo se puede redirigir la salida de la función que mueren en un archivo en Perl?

StackOverflow https://stackoverflow.com/questions/3940106

  •  30-09-2019
  •  | 
  •  

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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top