使用Monolog时如何实现简洁日志输出?
当然可以实现!
完全没问题,不管是改成你想要的极简格式,还是只去掉末尾的空括号,Monolog都支持自定义日志格式来满足你的需求。
核心思路:自定义LineFormatter
Monolog默认的日志格式会包含%context%和%extra%占位符,这就是你看到的末尾空括号的来源。我们只需要创建一个自定义的LineFormatter实例,指定你想要的格式字符串即可。
方案1:改成你想要的极简格式
直接定义你期望的日志模板,去掉多余的频道和级别信息,代码示例如下:
use Monolog\Logger; use Monolog\Handler\StreamHandler; use Monolog\Formatter\LineFormatter; // 初始化文件处理器 $logHandler = new StreamHandler('./my_log.log', Logger::INFO); // 定义自定义格式:日期 + 日志消息 $customFormatter = new LineFormatter( "[%datetime%] %message%\n", // 你的目标格式 'Y-m-d H:i:s', // 指定日期格式,和示例一致 false, true // 关键:忽略空的上下文和额外数据 ); // 将格式器绑定到处理器 $logHandler->setFormatter($customFormatter); // 创建日志实例并添加处理器 $logger = new Logger('my_logger'); $logger->pushHandler($logHandler); // 测试输出 $logger->info('My logger is now ready');
执行后日志文件就会输出你想要的样子:
[2018-02-13 15:06:12] My logger is now ready
[2018-02-13 15:06:29] My logger is now ready
方案2:仅去掉末尾的空括号
如果你还想保留频道和级别信息,只是去掉空括号,只需要调整格式字符串即可:
$customFormatter = new LineFormatter( "[%datetime%] %channel%.%level_name%: %message%\n", 'Y-m-d H:i:s', false, true );
这样输出的日志会是:
[2018-02-13 15:06:12] my_logger.INFO: My logger is now ready
[2018-02-13 15:06:29] my_logger.INFO: My logger is now ready
关键参数说明
LineFormatter的第四个参数$ignoreEmptyContextAndExtra设为true后,Monolog会自动忽略空的context和extra数据,也就不会再输出那些多余的空括号了。
内容的提问来源于stack exchange,提问作者Adam




