Take the 2-minute tour ×

I want to redirect the die messages to a separate file so that I can compare that file later to determine what went wrong.

But this code gives me errors:

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

I do not want to do a 2> from the caller. Is there someway to redirect them from within the script?

share|improve this question
add comment

3 Answers

up vote 7 down vote accepted

Perl's die prints to STDERR so you could redirect STDERR to a file.

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

open(STDERR, ">>", "errlog.log");
die "Hello";
share|improve this answer
This also redirects warn() messages, warnings, and anything else printed to STDERR. Not only that, if someone has done this properly by redefining the DIE handler, it might not even redirect die() messages. –  brian d foy Oct 15 '10 at 17:43
add comment

The Log::Log4perl module offers more than a few options.

One can choose to output the error message to both STDERR and the logfile.

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;

While it requires a little bit more effort in terms of setup, its flexibility unlocks a great deal of potential.

share|improve this answer
add comment

You can install a $SIG{__DIE__} handler to be run just before the "die" runs. The handler will be called with the error message which you can log:

local $SIG{__DIE__} = sub {
    my ($message) = @_;
    # log the message        

See $SIG{expr} in perlvar for details.

share|improve this answer
+1, much better/more flexible than my method. –  birryree Oct 15 '10 at 7:04
add comment

Your Answer


