[已解决]Monolog\Formatter引发的Over 9 levels deep, aborting normalization问题
问题
- 应用框架Hyperf中
- 当日志json解析深度超过9层后,就会显示
Over 9 levels deep, aborting normalization
.如图
追溯
config/logger.php
中formatter.class
引用的类是Monolog\Formatter\LineFormatter::class
Monolog\Formatter\LineFormatter::class
继承了Monolog\Formatter\NormalizerFormatter::class
NormalizerFormatter
内部属性maxNormalizeDepth
默认9层,同时该类提供公开方法setMaxNormalizeDepth
,利用这个方法就可以修改层度属性,核心就是我们需要把深度参数以构造参数形式引入进来调用setMaxNormalizeDepth()
动手解决
- 新建一个类文件
MongoLogMapLineFormatter.php
,根据你项目规范自行存放,并注意按照命名空间PSR-4
约定。比如我的命名空间路径是App\Repositories\ClassMap\MongoLogMapLineFormatter::class
MongoLogMapLineFormatter.php代码
<?php declare(strict_types=1); namespace App\Repositories\ClassMap; use Monolog\Formatter\LineFormatter; /** * 增加json序列化深度参数. */ class MongoLogMapLineFormatter extends LineFormatter { /** * @param string|null $format * @param string|null $dateFormat * @param bool $allowInlineLineBreaks * @param bool $ignoreEmptyContextAndExtra * @param bool $includeStacktraces * @param int $maxNormalizeDepth */ public function __construct(?string $format = null, ?string $dateFormat = null, bool $allowInlineLineBreaks = false, bool $ignoreEmptyContextAndExtra = false, bool $includeStacktraces = false, int $maxNormalizeDepth = 20) { parent::__construct($format, $dateFormat, $allowInlineLineBreaks, $ignoreEmptyContextAndExtra, $includeStacktraces); // 设置json的序列化深度 parent::setMaxNormalizeDepth($maxNormalizeDepth); } }
- 修改
config/autoload/logger.php
,把所有引用Monolog\Formatter\LineFormatter::class
的部分,全部换成App\Repositories\ClassMap\MongoLogMapLineFormatter::class
,如图
版权申明
本文系作者 @ninja911 原创发布在NinJa911 Blog站点。未经许可,禁止转载。
暂无评论数据