perl - 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
}
解决方案
正确的。我放弃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);
}
不知道它是否“正确”,但它工作顺利。
推荐阅读
- python - 附加到函数内的列表时出现 NameError (Python)
- java - heroku上的战争文件不运行
- ios - ios UI 更新代码如何定义用于主调度
- node-red - 让 node-red 与谷歌助手一起工作
- python - 即使在输入 api 密钥后,谷歌地图上也会出现 403 客户端禁止错误
- react-native - 在 ScrollView 中使用屏幕的 flex
- rest - 查询组合资源
- android - Android Rotation 重定向到 webview 的根 URL
- bash - Bash 脚本 - Printf 不会在每次输出后添加新行
- git - 如何用 jGit 做 git log -L?