如何让Mojo::Log同时输出日志到文件与stderr?
让Mojo::Log同时输出到文件和stderr/stdout的配置方法
默认情况下,当给Mojo::Log指定path参数时,它会将日志输出限制到指定文件,不再输出到默认的stderr。要实现同时输出到文件和终端(stderr/stdout),需要配置多个输出句柄,以下是两种可行方案:
方案一:初始化时指定多个句柄
直接在创建Mojo::Log实例时,通过handles参数传入文件句柄和stderr/stdout句柄:
use Mojolicious::Lite -signatures; # 以追加模式打开日志文件 open my $file_log, '>>', 'app.log' or die "无法打开app.log: $!"; # 获取标准错误输出句柄 my $stderr_log = *STDERR; # 创建同时输出到文件和stderr的日志器 my $log = Mojo::Log->new( handles => [$file_log, $stderr_log], level => 'trace', color => 1 ); # 将日志器绑定到应用 app->log($log); get '/' => sub ($c) { $c->log->warn('Foo'); $c->render(text => 'foo', status => 200); }; app->start;
handles参数接受一个句柄数组,日志会写入数组中的所有句柄- 用
>>模式打开文件可确保日志追加写入,不会覆盖原有内容 - 如果需要输出到stdout,替换
*STDERR为*STDOUT即可
方案二:先指定文件路径,再添加终端句柄
如果已经通过path指定了日志文件,也可以通过handle方法额外添加stderr/stdout句柄:
use Mojolicious::Lite -signatures; # 创建写入文件的日志器 my $log = Mojo::Log->new( path => 'app.log', level => 'trace', color => 1 ); # 添加stderr作为额外输出句柄 $log->handle(*STDERR); # 绑定到应用 app->log($log); get '/' => sub ($c) { $c->log->warn('Foo'); $c->render(text => 'foo', status => 200); }; app->start;
handle方法可多次调用,用于添加多个输出目标- 这种方式更适合需要在初始化后动态添加输出句柄的场景
内容的提问来源于stack exchange,提问作者Rawley Fowler
相关产品推荐
相关产品推荐

