RequestLogger.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. <?php
  2. namespace App\Module\System\Services;
  3. use Google\Protobuf\Internal\Message;
  4. use Illuminate\Http\Request as HttpRequest;
  5. use UCore\Model\RequestLog;
  6. use Uraus\Kku\Request;
  7. class RequestLogger
  8. {
  9. static $di;
  10. /**
  11. * @var RequestLog $requestLog
  12. */
  13. private $requestLog;
  14. private $httpRequest;
  15. private $response;
  16. public function __construct(HttpRequest $httpRequest)
  17. {
  18. $this->httpRequest = $httpRequest;
  19. $this->requestLog = new RequestLog();
  20. // 初始化请求日志
  21. $this->requestLog->request_unid = RUN_UNIQID;
  22. $this->requestLog->run_unid = RUN_UNIQID;
  23. $this->requestLog->path = $httpRequest->path();
  24. $this->requestLog->method = $httpRequest->method();
  25. $this->requestLog->headers = json_encode($httpRequest->headers->all());
  26. $this->requestLog->ipaddress = $httpRequest->ip();
  27. $this->requestLog->host = $httpRequest->getHost();
  28. // 根据Content-Type决定如何记录post数据
  29. $contentType = $httpRequest->header('Content-Type', '');
  30. $rawContent = $httpRequest->getContent();
  31. if (str_contains($contentType, 'application/json') && !empty($rawContent)) {
  32. // JSON请求直接记录JSON格式
  33. $this->requestLog->post = $rawContent;
  34. } elseif (str_contains($contentType, 'application/x-www-form-urlencoded') && !empty($rawContent)) {
  35. // 表单请求解码后记录为JSON格式
  36. parse_str($rawContent, $formData);
  37. $this->requestLog->post = json_encode($formData);
  38. } else {
  39. // 其他类型使用base64编码
  40. $this->requestLog->post = base64_encode($rawContent);
  41. }
  42. $this->requestLog->sale_date = strtotime(date('Y-m-d'));
  43. $this->requestLog->save();
  44. }
  45. public static function getDi()
  46. {
  47. if (!self::$di) {
  48. self::$di = new RequestLogger(request());
  49. }
  50. return self::$di;
  51. }
  52. public function setResponse(Message $response)
  53. {
  54. $this->response = $response;
  55. }
  56. /**
  57. * 设置JSON响应数据
  58. *
  59. * @param string $jsonResponse JSON格式的响应数据
  60. * @return void
  61. */
  62. public function setJsonResponse(string $jsonResponse)
  63. {
  64. $this->requestLog->response = $jsonResponse;
  65. }
  66. public function setError(string $error)
  67. {
  68. $this->requestLog->error = $error;
  69. }
  70. public function setRouter(string $router)
  71. {
  72. $this->requestLog->router = $router;
  73. }
  74. public function setUserId(int $user_id)
  75. {
  76. $this->requestLog->user_id = $user_id;
  77. }
  78. public function setRunTime(float $startTime)
  79. {
  80. $endTime = microtime(true);
  81. $this->requestLog->run_ms = intval(($endTime - $startTime) * 1000);
  82. }
  83. public function setProtobuf(Request $request)
  84. {
  85. $jsonData = $request->serializeToJsonString();
  86. $this->requestLog->protobuf_json = $jsonData ;
  87. $this->requestLog->request_unid = $request->getRequestUnid();
  88. }
  89. public function __destruct()
  90. {
  91. if ($this->response) {
  92. $this->requestLog->response = $this->response->serializeToJsonString();
  93. }
  94. $this->requestLog->update();
  95. }
  96. }