Laravel-将大量请求记录到文件中
当我在一个项目中工作时,我发现第三方API在Postman上工作,但在Guzzle客户端上不工作 调试Guzzle请求可能很困难,因此是否有任何方法可以记录Guzzle客户端发出的所有请求,以便查看这些请求?TLDR; 通过将第二个参数传递给客户机,然后它将记录所有请求,有一种简单的方法可以记录所有的Guzzle请求。但若有许多方法使用Guzzle客户端向第三方服务器发送请求,那个么这是一种丑陋的方式。我已经用拉威尔的服务容器完成了 长途跋涉,途经拉威尔的服务集装箱 当我在项目中使用Guzzle客户端并使用handler记录所有请求时,它看起来很好。但后来在许多不同的类中有许多方法,所以我必须随时随地编写记录器逻辑。然后我想为什么不利用Laravel的服务容器绑定一个对象,然后在任何地方使用它呢 我是这样做的。在AppServiceContainer.php的引导方法中,我们将添加所有代码。然后在控制器中,我们将使用客户端对象 将此use语句添加到AppServiceContainer.php文件的顶部 将以下代码添加到AppServiceContainer.php的引导方法中 解释 若您已经注意到上面的代码,在引导方法的第一行中,我们告诉Laravel,我们希望在您的服务容器中将此代码注册为Guzzle客户端 在最后一个return语句中,我们返回一个函数,该函数将接受一个参数$config。我们使用这个函数作为代理,这样我们就可以向它传递一个参数,这个参数可以在客户端对象中使用Laravel-将大量请求记录到文件中,laravel,logging,guzzle,guzzlehttp,Laravel,Logging,Guzzle,Guzzlehttp,当我在一个项目中工作时,我发现第三方API在Postman上工作,但在Guzzle客户端上不工作 调试Guzzle请求可能很困难,因此是否有任何方法可以记录Guzzle客户端发出的所有请求,以便查看这些请求?TLDR; 通过将第二个参数传递给客户机,然后它将记录所有请求,有一种简单的方法可以记录所有的Guzzle请求。但若有许多方法使用Guzzle客户端向第三方服务器发送请求,那个么这是一种丑陋的方式。我已经用拉威尔的服务容器完成了 长途跋涉,途经拉威尔的服务集装箱 当我在项目中使用Guzzle
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 [] []