1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
<?php
namespace GuzzleHttp\Subscriber\Log;
use GuzzleHttp\Event\RequestEvents;
use GuzzleHttp\Event\SubscriberInterface;
use GuzzleHttp\Event\CompleteEvent;
use GuzzleHttp\Event\ErrorEvent;
use Psr\Log\LoggerInterface;
use Psr\Log\LogLevel;
/**
* Plugin class that will add request and response logging to an HTTP request.
*
* The log plugin uses a message formatter that allows custom messages via
* template variable substitution.
*
* @see MessageLogger for a list of available template variable substitutions
*/
class LogSubscriber implements SubscriberInterface
{
/** @var LoggerInterface */
private $logger;
/** @var Formatter Formatter used to format log messages */
private $formatter;
/**
* @param LoggerInterface|callable|resource|null $logger Logger used to log
* messages. Pass a LoggerInterface to use a PSR-3 logger. Pass a
* callable to log messages to a function that accepts a string of
* data. Pass a resource returned from ``fopen()`` to log to an open
* resource. Pass null or leave empty to write log messages using
* ``echo()``.
* @param string|Formatter $formatter Formatter used to format log
* messages or a string representing a message formatter template.
*/
public function __construct($logger = null, $formatter = null)
{
$this->logger = $logger instanceof LoggerInterface
? $logger
: new SimpleLogger($logger);
$this->formatter = $formatter instanceof Formatter
? $formatter
: new Formatter($formatter);
}
public function getEvents()
{
return [
// Fire after responses are verified (which trigger error events).
'complete' => ['onComplete', RequestEvents::VERIFY_RESPONSE - 10],
'error' => ['onError', RequestEvents::EARLY]
];
}
public function onComplete(CompleteEvent $event)
{
$this->logger->log(
substr($event->getResponse()->getStatusCode(), 0, 1) == '2'
? LogLevel::INFO
: LogLevel::WARNING,
$this->formatter->format(
$event->getRequest(),
$event->getResponse()
), [
'request' => $event->getRequest(),
'response' => $event->getResponse()
]
);
}
public function onError(ErrorEvent $event)
{
$ex = $event->getException();
$this->logger->log(
LogLevel::CRITICAL,
$this->formatter->format(
$event->getRequest(),
$event->getResponse(),
$ex
), [
'request' => $event->getRequest(),
'response' => $event->getResponse(),
'exception' => $ex
]
);
}
}
|