Here:
use strict;
use warnings;
use Log::Log4perl qw(:easy);
my $conf = <<EOT;
log4perl.category = TRACE, Screen
# Regular Screen Appender
log4perl.appender.Screen = Log::Log4perl::Appender::Screen
log4perl.appender.Screen.stdout = 1
log4perl.appender.Screen.layout = PatternLayout
log4perl.appender.Screen.Threshold = TRACE
log4perl.appender.Screen.layout.ConversionPattern = %m%n
# File appender
log4perl.rootLogger = DEBUG, Log1
log4perl.appender.Log1 = Log::Log4perl::Appender::File
log4perl.appender.Log1.mode = append
log4perl.appender.Log1.autoflush = 0
log4perl.appender.Log1.layout = Log::Log4perl::Layout::SimpleLayout
log4perl.appender.Log1.filename = test.log
log4perl.appender.Log1.Threshold = INFO
EOT
Log::Log4perl->init(\$conf);
TRACE("message #1 (screen only)");
INFO("message #2");
INFO("message #3");
sleep(10);
ERROR("message #4");
In my play around, I found that buffering only reliably works when buffering to screen (which makes sense, given that switching off autoflush effectively buffers file output).