You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:42:54