如何使用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
相关产品推荐
相关产品推荐

