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

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

PHP是世界上最好的编程语言,它能快速的进行技术变现,让代码多一份价值。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 13
leo

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

2年前 评论
leo (作者) 2年前

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

2年前 评论
leo 2年前
PHP之父一只码 (作者) (楼主) 2年前
leo

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

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

2年前 评论

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

2年前 评论
PHP之父一只码 (楼主) 2年前

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

2年前 评论

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

2年前 评论

@chenji 这放哪里呀,大佬

2年前 评论

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

2年前 评论
// 文件目录 bootstrap\app.php
// 新增日志修改器
$app->configureMonologUsing(function(Monolog\Logger $monolog) {
    //修改日志输出路径,主要解决CLI访问日志存放问题,和这次主题无关
    $filename = storage_path('logs/laravel-'.php_sapi_name().'.log');
    $handler = new Monolog\Handler\RotatingFileHandler($filename);
    $monolog->pushHandler($handler);

    /**
    $_SERVER['LOG_REQUEST_ID']  //nginx配置的request_id
    $_SERVER['REQUEST_TIME_FLOAT']  //当nginx没配置的情况下获取当前时间坐标
    **/                
    if(empty($_SERVER['LOG_REQUEST_ID'])) $_SERVER['LOG_REQUEST_ID'] = $_SERVER['REQUEST_TIME_FLOAT'] ;
    //主要这个方法日志新增附加的数据,
    $monolog->pushProcessor(function($data){
        $data['extra']['request_id'] = $_SERVER['LOG_REQUEST_ID'];
        return $data ;
    });
});
1年前 评论

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