Laravel-日志对文件的大量请求 [英] Laravel - Log Guzzle requests to file
本文介绍了Laravel-日志对文件的大量请求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在处理一个项目时,我发现第三方API可以在Postman上工作,但不能在GUZLE客户端上工作。
调试GUZLE请求可能很困难,所以有什么方法可以记录GUICLE客户端发出的所有请求吗?
推荐答案
TLDR;
通过将第二个参数传递给客户端,有一种记录所有狂饮请求的简单方法,然后它将记录所有请求。但是,如果您有许多方法使用GUZLE客户端向第三方服务器发送请求,那么这种方式就很难看了。我使用的是Laravel的服务容器。通过Laravel的服务容器实现远距离
当我在项目中使用GUZLE客户端并使用HANDLER记录所有请求时,它看起来不错。但后来,在许多不同的类中有许多方法,所以我不得不在任何地方编写记录器逻辑。然后我想,为什么不利用Laravel的Service Container绑定一次对象,然后在任何地方使用它。
我是这样做的。在AppServiceContainer.php
的引导方法中,我们将添加所有代码。然后在控制器中,我们将使用客户端对象。
将此Use语句添加到AppServiceContainer.php
文件的顶部。
use GuzzleHttpClient;
use GuzzleHttpHandlerStack;
use GuzzleHttpMessageFormatter;
use GuzzleHttpMiddleware;
use IlluminateSupportServiceProvider;
use MonologHandlerRotatingFileHandler;
use MonologLogger;
将以下代码添加到AppServiceContainer.php的boot
方法
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->app->bind('GuzzleClient', function () {
$messageFormats = [
'REQUEST: {method} - {uri} - HTTP/{version} - {req_headers} - {req_body}',
'RESPONSE: {code} - {res_body}',
];
$stack = HandlerStack::create();
collect($messageFormats)->each(function ($messageFormat) use ($stack) {
// We'll use unshift instead of push, to add the middleware to the bottom of the stack, not the top
$stack->unshift(
Middleware::log(
with(new Logger('guzzle-log'))->pushHandler(
new RotatingFileHandler(storage_path('logs/guzzle-log.log'))
),
new MessageFormatter($messageFormat)
)
);
});
return function ($config) use ($stack){
return new Client(array_merge($config, ['handler' => $stack]));
};
});
}
说明
如果您注意到上面的代码,在引导方法的第一行,我们告诉Laravel,我们希望将此代码注册为您的服务容器中的GuzzleClient。
在最后一条返回语句中,我们返回的函数将接受一个参数$config
。我们将此函数用作代理,以便可以向其传递参数,并可以在客户端对象中使用该参数。
return function ($config) use ($stack){
return new Client(array_merge($config, ['handler' => $stack]));
};
代码的其余部分正在使用monolog库的Logger对象构建GUZLE的处理程序对象,以将所有请求记录到名为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创建一个对象$client
。此外,您还可以将GUCHLE客户端支持的任何有效参数数组作为第二个参数进行传递。这里我已经通过了base_uri
。
来源:http://shyammakwana.me/laravel/laravel-log-guzzle-requests-to-file-using-service-container.html
这篇关于Laravel-日志对文件的大量请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文