#!/usr/bin/perl -- use Path::Class; use constant THISFILE => file( __FILE__ )->absolute->stringify; use constant THISDIR => file( THISFILE )->dir->stringify; use strict; use warnings; use Log::Log4perl; chdir THISDIR or die Fudge( 'chdir', THISDIR ); Main( @ARGV ); exit( 0 ); sub Main { my $logconfig = q{; log4perl.logger.Groceries=DEBUG, A1 log4perl.appender.A1=Log::Log4perl::Appender::HJOfilnamed log4perl.appender.A1.mode=append log4perl.appender.A1.layout=Log::Log4perl::Layout::PatternLayout log4perl.appender.A1.layout.ConversionPattern=%d %p> %F{1}:%L %M - (%c) %m%n log4perl.logger.Junk=DEBUG, A2 log4perl.appender.A2=Log::Log4perl::Appender::HJOfilnamed log4perl.appender.A2.mode=append log4perl.appender.A2.layout=Log::Log4perl::Layout::PatternLayout log4perl.appender.A2.layout.ConversionPattern=%d %p> %F{1}:%L %M - (%c) %m%n log4perl.debug=true log4perl.b=DEBUG, A2 log4perl.category.Bar.Twix = DEBUG, Logfile log4perl.category.Bar.Mars = DEBUG, Logfile log4perl.appender.Logfile = Log::Log4perl::Appender::HJOfilnamed log4perl.appender.Logfile.layout = Log::Log4perl::Layout::PatternLayout log4perl.appender.Logfile.layout.ConversionPattern = %d %F{1} %L> (%c) %m %n log4perl.rootLogger = DEBUG, Logfile }; Log::Log4perl::init( \$logconfig ); { my $log = Log::Log4perl::get_logger("Groceries"); $log->info("Important Info!"); $log->info("Important Info! THEN NEWLINE\nTHEN IMPORTANTINFO"); } { my $log = Log::Log4perl::get_logger("Junk"); $log->info("UnImportant Info!"); } Bar::Twix::eat(); Bar::Mars::eat(); } BEGIN{ $INC{'Log/Log4perl/Appender/HJOfilnamed.pm'} = __FILE__; package Log::Log4perl::Appender::HJOfilnamed; use parent qw[ Log::Log4perl::Appender::File ]; use POSIX(); sub new { my $class = shift; my %opts = @_; my $tim = POSIX::strftime('%Y-%m-%dT%H-%M-%SZ', gmtime); my $fname = join '.', grep defined, $opts{name}, $opts{appender}, $tim, 'log'; $fname =~ s{::}{.}g; $fname =~ s{[^0-9a-zA-Z\-\+\.]}{}g; $fname = $1 if $fname =~ /^(.*)$/; return $class->SUPER::new( @_, filename => $fname ); } } sub Fudge { use Errno(); join qq/\n/, "Error @_", map { " $_" } int( $! ) . q/ / . $!, int( $^E ) . q/ / . $^E, grep( { $!{$_} } keys %! ), q/ /; } BEGIN { package Bar::Twix; use Log::Log4perl qw(:easy); sub eat { DEBUG("Twix mjam");INFO("YAM NEWLINE\nTwix mjam"); } package Bar::Mars; use Log::Log4perl qw(:easy); sub eat { INFO("Mars mjam");INFO("YAM NEWLINE\nMars mjam"); } }