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
------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
log4perl-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/log4perl-devel