Laravel-将大量请求记录到文件中

Laravel-将大量请求记录到文件中,laravel,logging,guzzle,guzzlehttp,Laravel,Logging,Guzzle,Guzzlehttp,当我在一个项目中工作时,我发现第三方API在Postman上工作,但在Guzzle客户端上不工作 调试Guzzle请求可能很困难,因此是否有任何方法可以记录Guzzle客户端发出的所有请求,以便查看这些请求?TLDR; 通过将第二个参数传递给客户机,然后它将记录所有请求,有一种简单的方法可以记录所有的Guzzle请求。但若有许多方法使用Guzzle客户端向第三方服务器发送请求,那个么这是一种丑陋的方式。我已经用拉威尔的服务容器完成了 长途跋涉,途经拉威尔的服务集装箱 当我在项目中使用Guzzle

当我在一个项目中工作时,我发现第三方API在Postman上工作,但在Guzzle客户端上不工作

调试Guzzle请求可能很困难,因此是否有任何方法可以记录Guzzle客户端发出的所有请求,以便查看这些请求?

TLDR; 通过将第二个参数传递给客户机,然后它将记录所有请求,有一种简单的方法可以记录所有的Guzzle请求。但若有许多方法使用Guzzle客户端向第三方服务器发送请求,那个么这是一种丑陋的方式。我已经用拉威尔的服务容器完成了

长途跋涉,途经拉威尔的服务集装箱 当我在项目中使用Guzzle客户端并使用handler记录所有请求时,它看起来很好。但后来在许多不同的类中有许多方法,所以我必须随时随地编写记录器逻辑。然后我想为什么不利用Laravel的服务容器绑定一个对象,然后在任何地方使用它呢

我是这样做的。在AppServiceContainer.php的引导方法中,我们将添加所有代码。然后在控制器中,我们将使用客户端对象

将此use语句添加到AppServiceContainer.php文件的顶部

将以下代码添加到AppServiceContainer.php的引导方法中

解释 若您已经注意到上面的代码,在引导方法的第一行中,我们告诉Laravel,我们希望在您的服务容器中将此代码注册为Guzzle客户端

在最后一个return语句中,我们返回一个函数,该函数将接受一个参数$config。我们使用这个函数作为代理,这样我们就可以向它传递一个参数,这个参数可以在客户端对象中使用

return function ($config) use ($stack){
      return new Client(array_merge($config, ['handler' => $stack]));
};
剩下的代码是使用Monolog库的Logger对象构建Guzzle的handler对象,将所有请求记录到一个名为Guzzle-Log.Log的文件中。如果启用了每日日志,则会在文件名后面添加日期,如guzzle-log-2019-08-11.log。 用法

我们已经将对象绑定到服务容器,现在是时候在代码中的任何地方使用这个容器了,并使它看起来干净

出于演示目的,我直接在routes/web.php文件中使用了它。你可以在任何地方使用

 Route::get('/', function () {

    $client = app('GuzzleClient')(['base_uri' => 'http://httpbin.org/']);

    $request = $client->get('get',[
        'query' => ['foo'=>'bar', 'baz' => 'baz2'] ,
        'headers' => [ 'accept' =>  'application/json']
    ]);
    $response = json_decode((string) $request->getBody());
    return response()->json($response);
});
如您所见,我正在使用app helper创建一个object$客户端。还可以将Guzzle客户端支持的任何有效参数数组作为第二个参数传递。这里我通过了base_uri


来源:

通过使用。另一种选择是将HTTP\Middleware的日志附加到您使用的任何位置。记录请求、响应和任何错误(如果发现)的示例是使用Middleware::log:


注意:此选项的缺点是,您必须附加MiddleWareMddleware::log。。。无论你在哪里使用Illumb\Support\Facades\Http。

我在laravel 7中使用Guzzle Http,你能帮助我如何实现这一点吗?这是我发布的问题
return function ($config) use ($stack){
      return new Client(array_merge($config, ['handler' => $stack]));
};
 Route::get('/', function () {

    $client = app('GuzzleClient')(['base_uri' => 'http://httpbin.org/']);

    $request = $client->get('get',[
        'query' => ['foo'=>'bar', 'baz' => 'baz2'] ,
        'headers' => [ 'accept' =>  'application/json']
    ]);
    $response = json_decode((string) $request->getBody());
    return response()->json($response);
});
<?php

namespace App\Services;


use Illuminate\Support\Facades\Http;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Logger;
use GuzzleHttp\MessageFormatter;
use GuzzleHttp\Middleware;

/**
 * Class TestService
 * @package App
 */
class TestService
{
    private function getAccessToken()
    {
        try {
            $response = Http::asForm()->withMiddleware(Middleware::log(with(new Logger('guzzle-log'))->pushHandler(
                new RotatingFileHandler(storage_path('logs/guzzle-log.log'))
            ), new MessageFormatter(MessageFormatter::DEBUG)))->post("https://test.com/oauth/v2/token", [
                'grant_type' => 'client_credentials',
            ]);
            $response->throw();
        } catch (\Throwable $th) {
            $accessToken = false;
        }
        return $accessToken;
    }
}
[2020-08-07T07:13:23.712124+00:00] guzzle-log.INFO: >>>>>>>> POST /oauth/v2/token HTTP/1.1 Content-Length: 29 User-Agent: GuzzleHttp/7 Host: xxxx:4000 Content-Type: application/x-www-form-urlencoded  grant_type=client_credentials <<<<<<<< HTTP/1.1 200 OK X-DNS-Prefetch-Control: off X-Frame-Options: SAMEORIGIN Strict-Transport-Security: max-age=15552000; includeSubDomains X-Download-Options: noopen X-Content-Type-Options: nosniff X-XSS-Protection: 1; mode=block Access-Control-Allow-Origin: * Content-Type: application/json; charset=utf-8 Content-Length: 113 ETag: W/"71-DyA+KEnetTKfUlb0lznokGTt0qk" Date: Fri, 07 Aug 2020 07:13:23 GMT Connection: keep-alive  {"data":{"token_type":"Bearer","access_token":"XYZ","expires_in":"7776000"}} -------- NULL [] []