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
log4perl-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/log4perl-devel

Reply via email to