I do it like this:
use Log::Log4perl;
my $logfile = 'clean.log';
unlink $logfile; # ignore errors
do { # Isolate
# Log configuration.
# If you go for interpolation, escape the {} in the pattern or use
# different delimiters or something.
my $lconf = q{
log4perl.logger = TRACE, ap1
log4perl.appender.ap1 = Log::Log4perl::Appender::File
log4perl.appender.ap1.filename = } . $logfile . q'
log4perl.appender.ap1.layout = Log::Log4perl::Layout::PatternLayou
+t
log4perl.appender.ap1.layout.ConversionPattern = %d{yyyyMMdd HH:mm
+:ss.SSSS} %5p %F{1} %L: %m %n
log4perl.appender.ap2 = Log::Log4perl::Appender::Screen
log4perl.appender.ap2.layout = Log::Log4perl::Layout::PatternL
+ayout
log4perl.appender.ap2.layout.ConversionPattern = %d{yyyyMMdd H
+H:mm:ss.SSSS} %5p %F{1} %L: %m %n
';
# unclear, but this MIGHT mean something.
Log::Log4perl::init ( \$lconf ) or die "Log init failed";
}; # Isolate
my $logger = Log::Log4perl->get_logger('Test');
That is, by using substitution within the quoted string config.
You could also do it using function-call config, and possibly by doing a string config and then overriding that one thing with a function call, I believe, but I haven't done that, so I won't give you fake example code.