|
From: Foudil <fou...@fr...> - 2010-07-06 18:06:31
|
Hi all,
In order to log to a tmp directory (that we want to remove later), we create an appender in a script that we add to our project's loggers:
Log::Log4perl->init_and_watch($path_conf."/log.conf", 'HUP'); # HUP needed for logrotate
my $logger = get_logger($FindBin::Script);
my $logger_all = Log::Log4perl->get_logger("OurProject");
# Local appender to log in tmp directory.
my $local_appender;
my $local_appender_name = 'LogTmp';
...
# Create appender to log error in tmp directory.
$local_appender = Log::Log4perl::Appender->new(
"Log::Log4perl::Appender::File",
name => $local_appender_name,
filename => "$spool_tmp/error.log",
mode => 'write',
syswrite => 1,
utf8 => 1,
);
my $layout = Log::Log4perl::Layout::PatternLayout->new("%d %P %p> %F{1}:%L %M - %m%n");
$local_appender->layout($layout);
$local_appender->threshold($CFG{'l4p_appender_logtmp_threshold'});
$logger->add_appender($local_appender);
$logger_all->add_appender($local_appender); # add appender to project modules' logger
...
$logger->remove_appender($local_appender_name);
$logger_all->remove_appender($local_appender_name);
rmtree($spool_tmp, {error => \my $err});
if (@$err) {
file_path_error($err);
exit;
}
$logger->info("removed $spool_tmp");
But rmtree() (File::Path) is complaining that $spool_tmp is not empty. $spool_tmp is on an NFS mount.
So we solved the pb with:
#$logger->remove_appender($local_appender_name);
#$logger_all->remove_appender($local_appender_name);
# "will first remove the appender from every logger in the system and then
# will delete all references Log4perl holds to it." (Log::Log4perl)
Log::Log4perl->eradicate_appender($local_appender_name);
# ...but the appender is still alive and keeps filehandles open. So we need
# to close them explicitly. Especially under NFS, where deleted but still
# opened files are kept by the kernel as '.nfsxxx' (see "NFS silly
# rename")
$local_appender->file_close(); # (undocumented, look into the code)
rmtree($spool_tmp, {error => \my $err});
if (@$err) {
file_path_error($err);
exit;
}
$logger->info("removed $spool_tmp");
My guess may be wrong, and I'd be interested to know if there is a better solution.
Best
Foudil
|