Laravel-日志对文件的大量请求 [英] Laravel - Log Guzzle requests to file

查看:0
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆