laravel内置的日志记录方式,如何优雅的统一加上request_id字段?

项目日志里的日志记录方式为
Log::channel('cancel_order')->error('取消订单',[ 'order' => $order, ]);
这个怎么统一加上request_id?
百度出来的有点复杂,还没尝试

技术变现,让代码多一份价值
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 8
leo

Laravel 8 加了这个功能 learnku.com/docs/laravel/8.x/loggi...

4个月前 评论
leo (作者) 4个月前

@leo

public function handle($request, Closure $next)
    {
        $requestId = (string) Str::uuid();

        Log::withContext([
            'request-id' => $requestId
        ]);

        return $next($request)->header('Request-Id', $requestId);
    }

8版本还真有withContext,Log门面有这个方法,版本5.8报错,没有,有啥好的解决方案没

4个月前 评论
leo 4个月前
一只码 (作者) (楼主) 4个月前
leo

withContext 就是这个 commit 引入的,github.com/laravel/framework/commi...

所以你要实现低版本的 Laravel 支持 withContext 只需要新建一个类继承 Illuminate\Log\Logger 这个类然后做与上面这个 commit 类似的修改,最后注入回 Laravel 的 container 即可

4个月前 评论

用one框架 github.com/lizhichao/one 吧,这些都是自带的默认就有 . request_id 文件名 行号

4个月前 评论
一只码 (楼主) 4个月前

@leo 留下了没有技术的泪水

4个月前 评论

self::$logger->pushProcessor(new \Monolog\Processor\UidProcessor(32));

4个月前 评论

这样写会不会有问题,channel 有个格式化器设置

//配置文件 logging
foreach ($return['channels'] as $k => &$channel) {
  if (in_array($k, ['channel1''channel2''channel3'])) {
  $channel['tap'] = [\App\Formatters\CustomizeLogFormatter::class];
  }
}
return $return;

//——————————————————————————————————————————————————————————
namespace App\Formatters
class CustomizeLogFormatter
{
    /**
     * 格式化日志输出
     *
     * @param \Illuminate\Log\Logger $logger
     * @return void
     */
    public function __invoke($logger)
    {
        $request = request();
        $requestId = $request->offsetGet('request_id');
        if (!$requestId) {
            $requestId = (string)Str::uuid();
            $request->offsetSet('request_id', $requestId);
        }
        foreach ($logger->getHandlers() as $handler) {
            $handler->setFormatter(new LineFormatter("[%datetime%] %channel%.%level_name% %message% $requestId %context% \n", 'Y-m-d H:i:s', true));
        }
    }
}

@leo @chenji

4个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!