lightools / bitbang-http-logger
通过 bitbang/http 库执行 HTTP 请求和响应的日志记录器。
Requires
- php: >=5.4
- bitbang/http: ~0.3.0
Requires (Dev)
- php: >=5.5
- lightools/xml: ~1.0.0
- mockery/mockery: ~0.9.4
- nette/tester: ~1.7.1
- nette/utils: ~2.3.7
Suggests
- lightools/xml: Allows you to use XmlFormatter.
- nette/utils: Allows you to use JsonFormatter.
This package is auto-updated.
Last update: 2024-09-18 13:14:51 UTC
README
此库允许您记录通过 bitbang/http 库中的客户端执行的所有 HTTP 流量。
安装
$ composer require lightools/bitbang-http-logger
基本用法
$writer = new Lightools\BitbangLogger\Writers\DefaultWriter(__DIR__ . '/logs/http'); $logger = new Lightools\BitbangLogger\HttpLogger($writer); $client = new Bitbang\Http\Clients\CurlClient(); $client->onRequest([$logger, 'onRequest']); $client->onResponse([$logger, 'onResponse']); $url = 'https://maps.googleapis.com/maps/api/distancematrix/json?origins=Praha&destinations=Brno'; $request = new Bitbang\Http\Request(Bitbang\Http\Request::GET, $url); try { $client->process($request); } catch (Bitbang\Http\BadResponseException $e) { // process exception }
日志记录
上面的示例将日志记录到文件 ./logs/http/2016-03-22/17-25-00-44956900_56fa569cc8c8d.txt
中(以下显示内容)。您可以看到请求和响应在同一文件中,并且一些时间戳包含在两个 HTTP 消息之上。这种行为是由 DefaultWriter
实现的,您可以通过实现自己的 IWritter
(您可能希望将 HTTP 请求和响应分别保存,更改文件命名或将日志存储在数据库中)来轻松更改它。当发生一些重定向时,DefaultWriter 还会保存整个 HTTP 通信 - 所有后续的 HTTP 请求都将存储在一个文件中。
(17-25-00-44956900)
GET https://maps.googleapis.com/maps/api/distancematrix/json?origins=Praha&destinations=Brno HTTP/1.1
expect:
connection: keep-alive
user-agent: Bitbang/0.3.0 (cURL)
(17-25-00-77731500)
HTTP/1.1 200
content-type: application/json; charset=UTF-8
date: Tue, 22 Mar 2016 16:25:27 GMT
expires: Wed, 23 Mar 2016 16:25:27 GMT
cache-control: public, max-age=86400
content-encoding: gzip
server: mafe
x-xss-protection: 1; mode=block
x-frame-options: SAMEORIGIN
alternate-protocol: 443:quic,p=1
alt-svc: quic=":443"; ma=2592000; v="31,30,29,28,27,26,25"
transfer-encoding: chunked
{
"destination_addresses" : [ "Brno, Česká republika" ],
"origin_addresses" : [ "Praha, Česká republika" ],
"rows" : [
{
"elements" : [
{
"distance" : {
"text" : "205 km",
"value" : 205461
},
"duration" : {
"text" : "2 hod, 0 min",
"value" : 7217
},
"status" : "OK"
}
]
}
],
"status" : "OK"
}
格式化
默认情况下,HTTP 主体按设置为请求或响应对象的方式打印到日志中,但您可以注册格式化程序使其更美观、更易于阅读。您只需实现 IFormatter
接口并将其注册到记录器中即可。此库附带一些实用的格式化程序 - 用于数组(典型的 POST)、JSON、XML 或用于 urlencoded HTTP 主体。ArrayFormatter 还支持相当常见的 CURLFile。
第一个能够格式化 HTTP 消息的格式化程序将被使用,因此从理论上讲,它们注册的顺序可能很重要。以下是使用所有默认格式化程序的示例
$xmlLoader = new Lightools\Xml\XmlLoader(); $arrayDumper = new Lightools\BitbangLogger\ArrayDumper(); $arrayFormatter = new Lightools\BitbangLogger\Formatters\ArrayFormatter($arrayDumper); $urlFormatter = new Lightools\BitbangLogger\Formatters\UrlEncodedFormatter($arrayDumper); $jsonFormatter = new Lightools\BitbangLogger\Formatters\JsonFormatter(); // requires nette/utils to work $xmlFormatter = new Lightools\BitbangLogger\Formatters\XmlFormatter($xmlLoader); // requires lightools/xml to work $writer = new Lightools\BitbangLogger\Writers\DefaultWriter(__DIR__ . '/logs/http'); $logger = new Lightools\BitbangLogger\HttpLogger($writer); $logger->registerFormatter($arrayFormatter); $logger->registerFormatter($urlFormatter); $logger->registerFormatter($jsonFormatter); $logger->registerFormatter($xmlFormatter);
限制
记录的 HTTP 标头可能不包含所有实际发送的标头,因为这些标头可能已被代理或 curl 库本身(例如非常实用的 CURLOPT_ENCODING)修改。
多个 HTTP 客户端
如果您在多个服务(例如 lightools/fio 和 lightools/ares)中使用 bitbang 客户端,并且不想将所有日志存储在同一文件夹中,则自定义 IWriter 或一些 HttpLoggerFactory 和 HttpClientFactory 可能很有用。
如何运行测试
$ vendor/bin/tester tests