lightools/bitbang-http-logger

通过 bitbang/http 库执行 HTTP 请求和响应的日志记录器。

v1.0.0 2016-03-29 15:31 UTC

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/fiolightools/ares)中使用 bitbang 客户端,并且不想将所有日志存储在同一文件夹中,则自定义 IWriter 或一些 HttpLoggerFactory 和 HttpClientFactory 可能很有用。

如何运行测试

$ vendor/bin/tester tests