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

如何设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:13:05