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

如何使用Monolog生成美观易读的多行日志条目?

让Monolog输出多行、人类可读的格式化日志

最近在处理GeoIP日志记录时,遇到个头疼的问题:默认情况下Monolog生成的日志是单行的,哪怕尝试用JsonFormatter,也只是把数据结构格式化了,但还是单行输出,完全达不到人类可读的多行美化效果。

最初的代码(日志为单行)

use Monolog\Logger; 
use Monolog\Handler\StreamHandler; 

$ipAddress = GeoIp\Manager::getRealIp(); 
$geoResult = GeoIp\Manager::getDataResult($ipAddress, 'ru'); 

$logger = new Logger('Debug'); 
$logger->pushHandler(new StreamHandler($_SERVER['DOCUMENT_ROOT'].'/logs/geo.log', Logger::DEBUG)); 
$logger->info('Location:', array('object' => print_r($geoResult, true))); 

解决办法:用LineFormatter开启换行支持

后来找到了可行的方案,通过配置LineFormatter来保留内容里的换行符,就能输出多行易读的日志了。修改后的代码如下:

use Monolog\Logger; 
use Monolog\Handler\StreamHandler; 
use Monolog\Formatter\LineFormatter; 

$ipAddress = GeoIp\Manager::getRealIp(); 
$geoResult = GeoIp\Manager::getDataResult($ipAddress, 'ru'); 

// 初始化LineFormatter,第三个参数设为true以保留换行
$formatter = new LineFormatter(null, null, true); 
$streamHandler = new StreamHandler($_SERVER['DOCUMENT_ROOT'].'/logs/geo.log', Logger::DEBUG); 
$streamHandler->setFormatter($formatter); 

$logger = new Logger('Debug'); 
$logger->pushHandler($streamHandler); 
$logger->info('Location:', array('object' => print_r($geoResult, true))); 

这里的核心是LineFormatter的第三个构造参数true,它会告诉格式化器不要去除输入内容中的换行符,这样print_r输出的结构化多行内容就能完整呈现在日志里,完美实现了人类可读的美化展示。

内容的提问来源于stack exchange,提问作者Ildar Meyker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:27:06