Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用Guzzle 6记录所有API调用_Php_Guzzle_Guzzle6 - Fatal编程技术网

Php 如何使用Guzzle 6记录所有API调用

Php 如何使用Guzzle 6记录所有API调用,php,guzzle,guzzle6,Php,Guzzle,Guzzle6,我正在尝试使用guzzle 6,它工作得很好,但是当涉及到如何记录所有api调用时,我就不知所措了。我只想简单地记录时间、从会话登录的用户、url和任何其他与API调用相关的常用信息。我似乎找不到任何有关Guzzle 6的文档,只有Guzzle 3(他们在其中更改了登录addSubscriber调用)。我当前的API调用是这样的: $client = new GuzzleHttp\Client(['defaults' => ['verify' => false]]); $res =

我正在尝试使用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]]);

您可以使用任何使用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();
关于日志中间件和消息格式化程序的详细信息还没有很好的文档记录。但是您可以在MessageFormatter中使用哪些变量


还有一个允许您自定义格式化程序等的方法。

@kingkongprog这是指定日志文件名称的方法

$logger = new Logger('MyLog');
$logger->pushHandler(new StreamHandler(__DIR__ . '/test.log'), Logger::DEBUG);

$stack->push(Middleware::log(
$logger,
new MessageFormatter('{req_body} - {res_body}')
));

对于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)]);

在此代码中,您在何处指定日志文件的名称?谢谢你发布这个!我没有在示例中设置处理程序。您可以选择在logger中使用哪种处理程序。如果要将消息记录到文件中,应选择StreamHandler。其他选择。您可以在创建记录器时传递处理程序,也可以通过
pushHandler
方法在之后进行设置。检查一下这个@kingkongprog这个工作就像上面提到的一样!但是@velioglu你能帮我在laravel中做同样的事情吗?我在这里使用单线API调用,比如$response=Http::withBody(json_encode($reqArray),'application/json')->withToken($token)->post($SearchByNameApi);我还问了一个问题,如果你能帮助我实现这一目标,我感到很高兴