#!/usr/bin/perl use Log::Log4perl qw/get_logger :no_extra_logdie_message/; use strict; use warnings; use YAML qw/LoadFile/; CHECK { LOG_INIT: { # Initialize logging local $/ = undef; Log::Log4perl::init(\); } LOG_WRAPPERS: { # Wrapper for logging fatal errors $SIG{__DIE__} = sub { #return if $^S; # ignore die in an eval block my ($message) = @_; chomp $message; # Get the actual caller for the "die" and not the wrapper local $Log::Log4perl::caller_depth; $Log::Log4perl::caller_depth++; my $log = get_logger(''); $log->logdie($message); }; } } #################### ## MAIN { #Can't locate Mo/builder.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at (eval 65) line 2, <$IN> line 1. my $yaml = LoadFile('./path/to/yaml/file.yml') or die "Could not parse config file:\n$!\n$^E"; eval { die "a hot potato"; }; # dies here if ($@) { print "I caught something:\n[$@]"; exit; } # this is never reached } __DATA__ layout_class = Log::Log4perl::Layout::PatternLayout # Layout for screen logging # [Priority] [File::Caller] [Line Number] > Message debug_layout_pattern = [%p] [%F{1}::%M] [%L] > %m %n ## ## LOGGERS ## log4perl.logger = TRACE, LogScreen # Logging to screen # (Includes TRACE and DEBUG priority level messages) log4perl.appender.LogScreen = Log::Log4perl::Appender::Screen log4perl.appender.LogScreen.utf8 = 1 log4perl.appender.LogScreen.layout = ${layout_class} log4perl.appender.LogScreen.layout.ConversionPattern = ${debug_layout_pattern}