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

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

技术变现,让代码多一份价值
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 8
leo

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

1周前 评论
leo (作者) 1周前

@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报错,没有,有啥好的解决方案没

1周前 评论
leo 1周前
一只码 (作者) (楼主) 1周前
leo

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

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

1周前 评论

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

1周前 评论
一只码 (楼主) 1周前

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

1周前 评论

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

1周前 评论

这样写会不会有问题,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

1周前 评论

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