Explorar o código

为OpenAPI模块控制器添加RequestLogger日志记录

- ApiController: 在handleRequest方法中添加RequestLogger
- AuthController: 为token、refresh、jwt方法添加RequestLogger
- AppController: 为info方法添加RequestLogger
- WebhookController: 为store方法添加RequestLogger
- 记录请求路由、运行时间、错误信息等详细日志
- 提升OpenAPI模块的可观测性和调试能力
AI Assistant hai 6 meses
pai
achega
a8aa1c5b62

+ 16 - 1
app/Module/OpenAPI/Controllers/ApiController.php

@@ -150,6 +150,12 @@ class ApiController extends Controller
      */
     protected function handleRequest(Request $request, HandlerInterface $handler): JsonResponse
     {
+        $startTime = microtime(true);
+
+        // 初始化请求日志记录器
+        $requestLogger = new \App\Module\System\Services\RequestLogger($request);
+        $requestLogger->setRouter("openapi/" . $request->route()->getName());
+
         try {
             // 准备请求数据
             $data = array_merge(
@@ -167,9 +173,18 @@ class ApiController extends Controller
             ];
 
             // 调用Handler处理请求
-            return $handler->handle($data, $context);
+            $response = $handler->handle($data, $context);
+
+            // 记录运行时间
+            $requestLogger->setRunTime($startTime);
+
+            return $response;
 
         } catch (\Exception $e) {
+            // 记录错误信息和运行时间
+            $requestLogger->setError($e->getMessage());
+            $requestLogger->setRunTime($startTime);
+
             return response()->json([
                 'success' => false,
                 'message' => '请求处理失败',

+ 15 - 1
app/Module/OpenAPI/Controllers/AppController.php

@@ -42,17 +42,28 @@ class AppController
     #[Middleware('openapi.scope:APP_READ')]
     public function info(Request $request): JsonResponse
     {
+        $startTime = microtime(true);
+
+        // 初始化请求日志记录器
+        $requestLogger = new \App\Module\System\Services\RequestLogger($request);
+        $requestLogger->setRouter("openapi/app/info");
+
         try {
             // 从请求中获取应用信息(由认证中间件设置)
             $app = $request->attributes->get('openapi_app');
-            
+
             if (!$app) {
+                $requestLogger->setError('应用信息不存在');
+                $requestLogger->setRunTime($startTime);
                 return response()->json([
                     'success' => false,
                     'message' => '应用信息不存在',
                 ], 404);
             }
 
+            // 记录运行时间
+            $requestLogger->setRunTime($startTime);
+
             return response()->json([
                 'success' => true,
                 'data' => [
@@ -70,6 +81,9 @@ class AppController
             ]);
 
         } catch (\Exception $e) {
+            // 记录错误信息和运行时间
+            $requestLogger->setError($e->getMessage());
+            $requestLogger->setRunTime($startTime);
             return response()->json([
                 'success' => false,
                 'message' => '获取应用信息失败',

+ 61 - 21
app/Module/OpenAPI/Controllers/AuthController.php

@@ -46,12 +46,21 @@ class AuthController
      */
     public function token(Request $request): JsonResponse
     {
+        $startTime = microtime(true);
+
+        // 初始化请求日志记录器
+        $requestLogger = new \App\Module\System\Services\RequestLogger($request);
+        $requestLogger->setRouter("openapi/auth/token");
+
         try {
             // 使用标准验证系统
             $validation = new \App\Module\OpenAPI\Validations\TokenRequestValidation($request->all());
             $validation->validate();
 
             if ($validation->isFail()) {
+                // 记录验证失败和运行时间
+                $requestLogger->setError('参数验证失败: ' . json_encode($validation->getErrors()));
+                $requestLogger->setRunTime($startTime);
                 return $this->errorResponse('参数验证失败', $validation->getErrors(), 400);
             }
 
@@ -59,28 +68,29 @@ class AuthController
             $grantType = $data['grant_type'];
 
             // 根据授权类型处理
-            switch ($grantType) {
-                case 'client_credentials':
-                    return $this->handleClientCredentials(
-                        $validation->app,
-                        $validation->scopes ?? []
-                    );
-
-                case 'authorization_code':
-                    return $this->handleAuthorizationCode(
-                        $validation->app,
-                        $data['code'],
-                        $validation->scopes ?? []
-                    );
-
-                case 'refresh_token':
-                    return $this->handleRefreshToken($data['refresh_token']);
-
-                default:
-                    return $this->errorResponse('不支持的授权类型', [], 400);
-            }
+            $response = match ($grantType) {
+                'client_credentials' => $this->handleClientCredentials(
+                    $validation->app,
+                    $validation->scopes ?? []
+                ),
+                'authorization_code' => $this->handleAuthorizationCode(
+                    $validation->app,
+                    $data['code'],
+                    $validation->scopes ?? []
+                ),
+                'refresh_token' => $this->handleRefreshToken($data['refresh_token']),
+                default => $this->errorResponse('不支持的授权类型', [], 400)
+            };
+
+            // 记录运行时间
+            $requestLogger->setRunTime($startTime);
+
+            return $response;
 
         } catch (\Exception $e) {
+            // 记录错误信息和运行时间
+            $requestLogger->setError($e->getMessage());
+            $requestLogger->setRunTime($startTime);
             return $this->errorResponse('获取令牌失败', ['message' => $e->getMessage()], 500);
         }
     }
@@ -151,21 +161,37 @@ class AuthController
      */
     public function refresh(Request $request): JsonResponse
     {
+        $startTime = microtime(true);
+
+        // 初始化请求日志记录器
+        $requestLogger = new \App\Module\System\Services\RequestLogger($request);
+        $requestLogger->setRouter("openapi/auth/refresh");
+
         try {
             $refreshToken = $request->input('refresh_token');
-            
+
             if (!$refreshToken) {
+                $requestLogger->setError('缺少刷新令牌');
+                $requestLogger->setRunTime($startTime);
                 return $this->errorResponse('缺少刷新令牌', [], 400);
             }
 
             $tokenData = $this->authService->refreshAccessToken($refreshToken);
             if (!$tokenData) {
+                $requestLogger->setError('刷新令牌无效');
+                $requestLogger->setRunTime($startTime);
                 return $this->errorResponse('刷新令牌无效', [], 400);
             }
 
+            // 记录运行时间
+            $requestLogger->setRunTime($startTime);
+
             return $this->successResponse('令牌刷新成功', $tokenData);
 
         } catch (\Exception $e) {
+            // 记录错误信息和运行时间
+            $requestLogger->setError($e->getMessage());
+            $requestLogger->setRunTime($startTime);
             return $this->errorResponse('刷新令牌失败', ['message' => $e->getMessage()], 500);
         }
     }
@@ -202,6 +228,12 @@ class AuthController
      */
     public function jwt(Request $request): JsonResponse
     {
+        $startTime = microtime(true);
+
+        // 初始化请求日志记录器
+        $requestLogger = new \App\Module\System\Services\RequestLogger($request);
+        $requestLogger->setRouter("openapi/auth/jwt");
+
         try {
             $appId = $request->input('app_id');
             $appSecret = $request->input('app_secret');
@@ -209,6 +241,8 @@ class AuthController
             // 验证应用
             $app = $this->openApiService->validateApp($appId, $appSecret);
             if (!$app) {
+                $requestLogger->setError('应用认证失败');
+                $requestLogger->setRunTime($startTime);
                 return $this->errorResponse('应用认证失败', [], 401);
             }
 
@@ -220,6 +254,9 @@ class AuthController
 
             $token = $this->authService->generateJwtToken($app, $payload);
 
+            // 记录运行时间
+            $requestLogger->setRunTime($startTime);
+
             return $this->successResponse('JWT令牌生成成功', [
                 'token' => $token,
                 'token_type' => 'Bearer',
@@ -227,6 +264,9 @@ class AuthController
             ]);
 
         } catch (\Exception $e) {
+            // 记录错误信息和运行时间
+            $requestLogger->setError($e->getMessage());
+            $requestLogger->setRunTime($startTime);
             return $this->errorResponse('生成JWT令牌失败', ['message' => $e->getMessage()], 500);
         }
     }

+ 17 - 1
app/Module/OpenAPI/Controllers/WebhookController.php

@@ -91,10 +91,18 @@ class WebhookController
     #[Middleware('openapi.scope:WEBHOOK_WRITE')]
     public function store(Request $request): JsonResponse
     {
+        $startTime = microtime(true);
+
+        // 初始化请求日志记录器
+        $requestLogger = new \App\Module\System\Services\RequestLogger($request);
+        $requestLogger->setRouter("openapi/webhook/store");
+
         try {
             $app = $request->attributes->get('openapi_app');
-            
+
             if (!$app) {
+                $requestLogger->setError('应用信息不存在');
+                $requestLogger->setRunTime($startTime);
                 return response()->json([
                     'success' => false,
                     'message' => '应用信息不存在',
@@ -106,6 +114,8 @@ class WebhookController
             $validation->validate();
 
             if ($validation->isFail()) {
+                $requestLogger->setError('数据验证失败: ' . json_encode($validation->getErrors()));
+                $requestLogger->setRunTime($startTime);
                 return response()->json([
                     'success' => false,
                     'message' => '数据验证失败',
@@ -118,6 +128,9 @@ class WebhookController
             // 创建Webhook
             $webhook = $this->webhookService->createWebhook($app, $data);
 
+            // 记录运行时间
+            $requestLogger->setRunTime($startTime);
+
             return response()->json([
                 'success' => true,
                 'message' => 'Webhook创建成功',
@@ -135,6 +148,9 @@ class WebhookController
             ]);
 
         } catch (\Exception $e) {
+            // 记录错误信息和运行时间
+            $requestLogger->setError($e->getMessage());
+            $requestLogger->setRunTime($startTime);
             return response()->json([
                 'success' => false,
                 'message' => '创建Webhook失败',