如何设置Monolog LineFormatter中%level_name%的字段宽度?
Monolog LineFormatter 实现level_name字段宽度对齐
Monolog的LineFormatter默认不支持在模板中直接使用类似printf的格式修饰符(比如%-10s),所以你之前的尝试会把格式标记当成字面文本输出。要实现level_name的固定宽度对齐,有两种简单的方案:
方案一:自定义LineFormatter子类
通过继承LineFormatter,重写数据归一化逻辑,对level_name进行补空格处理:
class AlignedLevelLineFormatter extends \Monolog\Formatter\LineFormatter { protected function normalize($data) { $data = parent::normalize($data); // 根据最长的level_name(比如WARNING是7位)设置宽度,这里设为8位保证对齐 if (isset($data['level_name'])) { $data['level_name'] = str_pad($data['level_name'], 8, ' ', STR_PAD_RIGHT); } return $data; } } // 替换原有的Formatter使用方式 $output = "[%datetime%] %level_name% %channel%: %message%\n"; $stream_handler->setFormatter(new AlignedLevelLineFormatter($output));
方案二:使用Placeholder格式化回调
不需要自定义子类,直接给LineFormatter设置针对level_name的格式化回调函数:
$output = "[%datetime%] %level_name% %channel%: %message%\n"; $formatter = new \Monolog\Formatter\LineFormatter($output); // 为level_name添加格式化逻辑,左对齐并补空格到8位 $formatter->setPlaceholderFormatter([ 'level_name' => function($levelName) { return str_pad($levelName, 8, ' ', STR_PAD_RIGHT); } ]); $stream_handler->setFormatter($formatter);
效果验证
两种方案都能生成你需要的对齐格式日志:
[2023-07-03T05:30:31.327443+02:00] DEBUG test: This is a debug message. [2023-07-03T05:30:31.327555+02:00] INFO test: This is an info level message. [2023-07-03T05:30:31.327683+02:00] WARNING test: This is a warning level message. [2023-07-03T05:30:31.327806+02:00] ERROR test: This is an error level message.
你可以根据自己的需求调整str_pad的宽度参数,比如如果需要更宽的占位,把8改成10即可。
内容的提问来源于stack exchange,提问作者Valon
相关产品推荐
相关产品推荐

