问题

  1. 应用框架Hyperf中
  2. 当日志json解析深度超过9层后,就会显示Over 9 levels deep, aborting normalization.如图 a02.png

追溯

  1. config/logger.phpformatter.class引用的类是Monolog\Formatter\LineFormatter::class
  2. Monolog\Formatter\LineFormatter::class继承了Monolog\Formatter\NormalizerFormatter::class
  3. NormalizerFormatter内部属性maxNormalizeDepth默认9层,同时该类提供公开方法setMaxNormalizeDepth,利用这个方法就可以修改层度属性,核心就是我们需要把深度参数以构造参数形式引入进来调用setMaxNormalizeDepth()

动手解决

  1. 新建一个类文件MongoLogMapLineFormatter.php,根据你项目规范自行存放,并注意按照命名空间PSR-4约定。比如我的命名空间路径是App\Repositories\ClassMap\MongoLogMapLineFormatter::class
  2. 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);
     }
    }
    
  3. 修改config/autoload/logger.php,把所有引用Monolog\Formatter\LineFormatter::class的部分,全部换成App\Repositories\ClassMap\MongoLogMapLineFormatter::class,如图截图1
分类: PHP之路 标签: PHPhyperfMonolog

评论

暂无评论数据

暂无评论数据

目录