文章

Thinkphp6记录请求日志

Thinkphp6记录请求日志

建立中间件 RequestLog

<?php

namespace app\middleware;

use Closure;
use think\Request;
use think\Response;
use think\facade\Log;

class RequestLog
{
    /**
     * 处理请求
     *
     * @param Request $request
     * @param Closure $next
     * @return Response
     */
    public function handle(Request $request, Closure $next)
    {
        $header = $request->header();
        $uniqueId = $header['x-trace-id'] ?? uniqid();

        // 在请求处理之前记录日志
        Log::info('Request Log: ' . json_encode([
                'url' => $request->url(),
                'method' => $request->method(),
                'x-trace-id' => $uniqueId,
                'ip' => $request->ip(),
                'params' => $request->param(),
                'time' => time(),
                'header' => $request->header(),
            ]));

        // 处理请求
        $response = $next($request);

        $data = $response->getData() ?? [];
        $code = $data['code'] ?? $response->getCode();

        // 在请求处理之后记录日志
        Log::info('Response Log: ' . json_encode([
                'x-trace-id' => $uniqueId,
                'code' => $code,
                'time' => time()
            ]));

        return $response;
    }
}

application/middleware.php 中定义中间件

<?php
// 全局中间件定义文件
return [
    app\middleware\RequestLog::class
];

在应用配置文件中 config/middleware.php 启用中间件

<?php
// 中间件配置
return [
    // 别名或分组
    'alias' => [
        'request_log' => app\middleware\RequestLog::class,
    ],
    // 优先级设置,此数组中的中间件会按照数组中的顺序优先执行
    'priority' => [],
];

以上操作后,每次请求都会记录 日志,方便问题排查

License:  CC BY 4.0