首页 > 解决方案 > Perl Log::Dispatch:在运行中更改日志记录位置?

问题描述

Log::Dispatch在一个大型 Mooseified 应用程序中使用,通过MooseX::LogDispatch. 我的设置或多或少:

use Moose;
with 'MooseX::LogDispatch';

has log_dispatch_conf => (
    is => 'ro',
    isa => 'HashRef',
    lazy => 1,
    required => 1,
    default => sub {
        my $self = shift;
        return {
            class => 'Log::Dispatch::File',
            min_level => 'debug',
            filename => $self->config->{logfile},
            mode => '>>',
            newline => 1
        };
    },
);

有什么方法可以在运行过程中更改日志文件的位置?我的具体用例是我正在处理许多不同的大型 [事物],它们在运行时传入,我希望每个 [事物] 都记录到自己的文件中。像这样的东西:

foreach my $thing (@things) {
    my $logfile = $self->config->{log_base} . $thing->{name} . time() . ".log";
    # do something here to set log location
    $self->logger->info("Start processing " . $thing->{name} . " at " . scalar localtime());
    # process $thing
}

标签: perllogging

解决方案


正确的。我放弃MooseX::LogDispatch并自己做了。

当我们有一个新的 [事物] 时,我只是调用一个触发器来触发一个_set_logger方法:

sub _set_logger {
    my ($self, $thing) = @_;

    my $log_dir = $self->config->{log_dir}; # /path/to/log_dir
    my $log_file_base = $self->config->{log_file_base}; # e.g. process-thing-log

    my $t = localtime;

    my $logfile = $log_dir . "/" . $log_file_base . $thing->{name} . "-" . $t->ymd . ".log";

    my $logger = Log::Dispatch->new(
    outputs => [
        [ 'File',
          min_level => 'debug',
          filename => $logfile,
          mode => '>>',
          newline => 1,
       ],
     ],
    );

    $self->logger($logger);
    $self->logger->info("Started run at " . scalar localtime);
}

不知道它是否“正确”,但它工作顺利。


推荐阅读