如何使用耗时记录错误?

时间:2018-10-08 10:51:54

标签: php logging guzzle

我计划使用 Guzzle 与现有的REST API进行通信。我想用monolog记录所有失败的api调用。

当api调用失败(HTTP状态代码不是预期的)时,我需要记录失败,以便有人可以查看并解决问题。

我设法使用'http_errors' => false打开关闭异常,这样我就不必捕获多个异常(对于4XX,5XX等代码)。我还用$client->post()实例化替换了new Request('POST')调用,以在API调用失败时获得请求对象。

现在我剩下的是这段代码:

$request = new Request('POST', 'vouchers');
$response = $this->client->send($request, ['json' => $info]);

if ($response->getStatusCode() != 201) {
    $this->log->error('Voucher was not created.', [
        'request' => [
            'headers' => $request->getHeaders(),
            'uri' => $request->getUri()->__toString(),
            'method' => $request->getMethod(),
            'body' => $request->getBody(),
        ],
        'response' => [
            'code' => $response->getStatusCode(),
            'status' => $response->getReasonPhrase(),
            'headers' => $response->getHeaders(),
            'body' => $response->getBody(),
        ],
    ]);
}

这将导致以下日志记录。

{
   "request":{
      "headers":[

      ],
      "uri":"vouchers",
      "method":"POST",
      "body":"[object] (GuzzleHttp\\Psr7\\Stream: )"
   },
   "response":{
      "code":404,
      "status":"Not Found",
      "headers":{
         "Server":[
            "openresty"
         ],
         "Date":[
            "Mon, 08 Oct 2018 10:28:53 GMT"
         ],
         "Content-Type":[
            "text/html;charset=UTF-8"
         ],
         "Content-Length":[
            "915"
         ],
         "Connection":[
            "keep-alive"
         ],
         "Vary":[
            "Accept-Encoding"
         ]
      },
      "body":"<body of the response>"
     }
}

这对我来说真的不可用,因为缺少请求的标头(可能是因为标头是由 Guzzle 而不是由我在实例化Request对象时插入的)。 URI也不是绝对的,主体也不可用。

是的,我可以使用json_encode()手动创建主体,并手动解析URI,但这会导致更多与业务无关的代码。


是否可以用 Guzzle 记录整个请求和响应信息,而无需弄乱冗长的代码以仅从 Guzzle 对象中提取信息?

0 个答案:

没有答案