softonic / guzzle_logger
A Guzzle middleware to log request and responses automatically
Requires
- php: ^7.2 || ^8.0
- ext-json: *
- guzzlehttp/guzzle: ^6.1 || ^7
- guzzlehttp/psr7: ^1.7 || ^2.0
- psr/log: ^1.1 || ^2.0 || ^3.0
Requires (Dev)
- colinodell/psr-testlogger: ^1.3
- phpstan/phpstan: ~0.12.32
- phpstan/phpstan-phpunit: ^0.12.11
- phpstan/phpstan-strict-rules: ^0.12.2
- phpunit/phpunit: ^8.5.8 || ^9.2.5
- squizlabs/php_codesniffer: ^3.5.5
Suggests
- monolog/monolog: A PSR-3 logger to send your logs to files, sockets and various web services
README
This is a middleware for guzzle that will help you automatically log every request and response using a PSR-3 logger.
The middleware is functional with version 6 of Guzzle.
Install
Via Composer
$ composer require softonic/guzzle_logger
Usage
Simple usage
use GuzzleLogMiddleware\LogMiddleware; use GuzzleHttp\HandlerStack; $logger = new Logger(); //A new PSR-3 Logger like Monolog $stack = HandlerStack::create(); // will create a stack stack with middlewares of guzzle already pushed inside of it. $stack->push(new LogMiddleware($logger)); $client = new GuzzleHttp\Client([ 'handler' => $stack, ]);
From now on each request and response you execute using $client
object will be logged.
By default the middleware logs every activity with level DEBUG
.
Advanced initialization
The signature of the LogMiddleware
class is the following:
\GuzzleLogMiddleware\LogMiddleware( \Psr\Log\LoggerInterface $logger, \GuzzleLogMiddleware\Handler\HandlerInterface $handler = null, bool $onFailureOnly = false, bool $logStatistics = false );
- logger - The PSR-3 logger to use for logging.
- handler - A HandlerInterface class that will be responsible for logging your request/response. Check Handlers sections.
- onFailureOnly - By default the middleware is set to log every request and response. If you wish to log the HTTP messages only when guzzle returns a rejection set this as true or when an exception occurred. Guzzle returns a rejection when http_errors option is set to true.
- logStatistics - If you set this option as true then the middleware will also log statistics about the HTTP transaction.
Handlers
In order to make the middleware more flexible we allow the developer to initialize it with a handler.
A handler is the class that will be responsible for logging the HTTP message and it must implement a HandlerInterface
.
As an example let's say that we create the following handler:
<?php namespace GuzzleLogMiddleware\Handler; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\RequestInterface; use GuzzleHttp\TransferStats; use Psr\Log\LoggerInterface; /** A simple handler that logs only requests */ final class SimpleHandler implements HandlerInterface { public function log( LoggerInterface $logger, RequestInterface $request, ?ResponseInterface $response = null, ?\Throwable $exception = null, ?TransferStats $stats = null, array $options = [] ): void { $logger->debug('Guzzle HTTP request: ' . \GuzzleHttp\Psr7\str($request)); return; } }
We can pass the handler above during construction of the middleware.
<?php use GuzzleLogMiddleware\LogMiddleware; use GuzzleHttp\HandlerStack; $logger = new Logger(); //A new PSR-3 Logger like Monolog $stack = HandlerStack::create(); // will create a stack stack with middlewares of guzzle already pushed inside of it. $stack->push(new LogMiddleware($logger, new SimpleHandler())); $client = new GuzzleHttp\Client([ 'handler' => $stack, ]);
From now on all Requests will be logged. Note that at the example above only requests are logged.
Important
If no handler is passed the middleware will initialize it's own handler. At the moment the default one is MultiRecordArrayHandler
MultiRecordArrayHandler
This is the default handler used from the middleware. This handler uses internally the FixedStrategy
and logs all request
and responses with level debug. This handler adds a separate log entry for each Request
, Response
, Exception
or TransferStats
.
The information about each object are added as a context
array to the log entry.
StringHandler
This handler uses internally the FixedStrategy
and logs all request and responses with level debug. You can initialize this handler
with a custom strategy. This handler adds a separate log entry for each Request, Response, Exception or TransferStats.
The handler converts the objects to strings and the information about each object are added to the message
of the log entry.
Log Level Strategies
Strategies are used to define the LogLevel that the handler will use to log each object.
FixedStrategy
You can use this strategy to log each HTTP Message with a specific level.
StatusCodeStrategy
You can use this strategy to log each HTTP Response with a specific level depending on the status code of the Response.
$strategy = new StatusCodeStrategy( LogLevel::INFO, // Default level used for requests or for responses that status code are not set with a different level. LogLevel::CRITICAL // Default level used for exceptions. ); $strategy->setLevel(404, LogLevel::WARNING); $multiRecordArrayHandler = new MultiRecordArrayHandler($strategy); $logger = new Logger(); //A new PSR-3 Logger like Monolog $stack = HandlerStack::create(); // will create a stack stack with middlewares of guzzle already pushed inside of it. $stack->push(new LogMiddleware($logger, $multiRecordArrayHandler)); $client = new GuzzleHttp\Client([ 'handler' => $stack, ]);
Using options on each request
You can set on each request options about your log.
$client->get('/', [ 'log' => [ 'on_exception_only' => true, 'statistics' => true, ] ]);
on_exception_only
Do not log anything unless if the response status code is above the threshold.statistics
if theon_exception_only
option/variable is true and this is also true the middleware will log statistics about the HTTP call.
Change log
Please see CHANGELOG for more information what has changed recently.
Testing
$ composer test
Credits
License
The MIT License (MIT). Please see License File for more information.