【问题标题】:How do you log all API calls using Guzzle 6如何使用 Guzzle 6 记录所有 API 调用
【发布时间】:2015-12-17 07:45:49
【问题描述】:

我正在尝试使用 guzzle 6,它工作正常,但在如何记录所有 api 调用时我迷失了。我想简单地记录时间、会话中的登录用户、url 以及与 API 调用有关的任何其他常见相关信息。我似乎找不到 Guzzle 6 的任何文档,只有 guzzle 3(他们更改了日志记录 addSubscriber 调用)。这就是我当前的 API 调用方式:

$client = new GuzzleHttp\Client(['defaults' => ['verify' => false]]);
$res = $client->get($this->url . '/api/details', ['form_params' => ['file' => $file_id]]);

【问题讨论】:

    标签: php guzzle guzzle6


    【解决方案1】:

    您可以在 Guzzle 6 中使用任何实现 PSR-3 接口的记录器

    在下面的示例中,我使用 Monolog 作为记录器和 Guzzle 的内置中间件和 MessageFormatter。

    use GuzzleHttp\HandlerStack;
    use GuzzleHttp\Middleware;
    use GuzzleHttp\MessageFormatter;
    use Monolog\Logger;
    
    $stack = HandlerStack::create();
    $stack->push(
        Middleware::log(
            new Logger('Logger'),
            new MessageFormatter('{req_body} - {res_body}')
        )
    );
    $client = new \GuzzleHttp\Client(
        [
            'base_uri' => 'http://httpbin.org',
            'handler' => $stack,
        ]
    );
    
    echo (string) $client->get('ip')->getBody();
    

    关于日志中间件和消息格式化程序的细节还没有很好的记录。但是你可以check the listMessageFormatter中可以使用哪些变量

    还有一个guzzle-logmiddleware 允许您自定义格式化程序等。

    【讨论】:

    • 这段代码在哪里指定日志文件的名称?感谢您发布此信息!
    • 示例中我没有设置处理程序。您可以选择将在记录器中使用的处理程序类型。如果要将消息记录到文件中,则应选择 StreamHandler。 check the monolog documentation 其他选项。您可以在创建 Logger 时传递处理程序,也可以在之后通过 pushHandler 方法设置它。检查这个example@KingKongFrog
    • 这如前所述!但是@velioglu 你能帮我在 laravel 中做同样的事情吗,我使用单行 API 调用,比如 $response = Http::withBody( json_encode($reqArray), 'application/json')->withToken($token)->发布($SearchByNameApi);我也问这个stackoverflow.com/questions/67920040/…的问题,如果你能帮助我实现这个目标,我会很高兴
    【解决方案2】:

    @KingKongFrog 这是指定日志文件名的方式

    $logger = new Logger('MyLog');
    $logger->pushHandler(new StreamHandler(__DIR__ . '/test.log'), Logger::DEBUG);
    
    $stack->push(Middleware::log(
    $logger,
    new MessageFormatter('{req_body} - {res_body}')
    ));
    

    【讨论】:

    • 要正常工作需要添加use Monolog\Handler\StreamHandler;。很好的例子。
    【解决方案3】:

    对于 Guzzle 7,我这样做了::

    require './guzzle_7.2.0.0/vendor/autoload.php';
    require './monolog/vendor/autoload.php';
    
    use GuzzleHttp\Client;
    use GuzzleHttp\Exception\RequestException;
    use GuzzleHttp\Pool;
    use GuzzleHttp\Psr7\Request;
    use GuzzleHttp\HandlerStack;
    use GuzzleHttp\Middleware;
    
    use GuzzleHttp\MessageFormatter;
    use Monolog\Logger;
    use Monolog\Handler\StreamHandler;
    
    use GuzzleHttp\TransferStats;
    
    //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    $logger = null;
    $messageFormat = 
                //['REQUEST: ', 'METHOD: {method}', 'URL: {uri}', 'HTTP/{version}', 'HEADERS: {req_headers}', 'Payload: {req_body}', 'RESPONSE: ', 'STATUS: {code}', 'BODY: {res_body}'];
                'REQUEST: urldecode(req_body)';
    $handlerStack = \GuzzleHttp\HandlerStack::create(); 
    $handlerStack->push(createGuzzleLoggingMiddleware($messageFormat));
    function getLogger() {
        global $logger;
        if ($logger==null) {
            $logger = new Logger('api-consumer');
            $logger->pushHandler(new \Monolog\Handler\RotatingFileHandler('./TataAigHealthErrorMiddlewarelog.txt'));
        }
        var_dump($logger);
        return $logger;
        }
    function createGuzzleLoggingMiddleware(string $messageFormat){
        return \GuzzleHttp\Middleware::log(getLogger(), new \GuzzleHttp\MessageFormatter($messageFormat));
    }
    
    function createLoggingHandlerStack(array $messageFormats){  
        global $logger;
        $stack = \GuzzleHttp\HandlerStack::create();
        var_dump($logger);
        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(createGuzzleLoggingMiddleware($messageFormat) );
        });
        return $stack;
    }
    //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    
    $client = new Client(['verify' => false, 'handler' => $tapMiddleware($handlerStack)]);
    

    哇!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      相关资源
      最近更新 更多