onlime/laravel-http-client-global-logger

Laravel HTTP 客户端的全球日志记录器

v1.1.3 2024-03-14 15:50 UTC

This package is auto-updated.

Last update: 2024-09-14 17:53:43 UTC


README

Latest Version on Packagist Packagist Downloads PHP from Packagist Build Status GitHub License

一个为 Laravel HTTP 客户端 设计的超级简单的全局日志记录器。

安装

您可以通过 Composer 安装此软件包

$ composer require onlime/laravel-http-client-global-logger

配置

这是一个零配置软件包。它由 Laravel 自动发现,并且全局日志记录默认启用。无需进一步配置 - 您可以直接跳转到下面的 使用 部分。

可选地使用以下命令发布配置文件

$ php artisan vendor:publish --provider="Onlime\LaravelHttpClientGlobalLogger\Providers\ServiceProvider"

您可以在您的 .env 中覆盖其配置 - 支持以下环境变量

  • HTTP_CLIENT_GLOBAL_LOGGER_ENABLED (布尔值)
  • HTTP_CLIENT_GLOBAL_LOGGER_MIXIN (布尔值)
  • HTTP_CLIENT_GLOBAL_LOGGER_CHANNEL (字符串)
  • HTTP_CLIENT_GLOBAL_LOGGER_LOGFILE (字符串)
  • HTTP_CLIENT_GLOBAL_LOGGER_REQUEST_FORMAT (字符串)
  • HTTP_CLIENT_GLOBAL_LOGGER_RESPONSE_FORMAT (字符串)
  • HTTP_CLIENT_GLOBAL_LOGGER_OBFUSCATE_ENABLED (布尔值)
  • HTTP_CLIENT_GLOBAL_LOGGER_OBFUSCATE_REPLACEMENT (字符串)
  • HTTP_CLIENT_GLOBAL_LOGGER_TRIM_RESPONSE_BODY_ENABLED (布尔值)
  • HTTP_CLIENT_GLOBAL_LOGGER_TRIM_RESPONSE_BODY_LIMIT (整数)
  • HTTP_CLIENT_GLOBAL_LOGGER_TRIM_RESPONSE_BODY_CONTENT_TYPE_WHITELIST (字符串)

(查看 config/http-client-global-logger.php 以获取默认值、进一步配置和说明)

功能

使用此日志记录器将记录使用 Laravel HTTP 客户端 发出的外部 HTTP 请求的请求和响应。

  • 包含完整请求/响应信息的多行日志记录(包括所有头和体)
  • 将日志记录到单独的日志文件 http-client.log。您可以覆盖此设置并使用自己的日志通道或仅记录到不同的日志文件。
  • 完全支持 Guzzle MessageFormatter 变量替换,以创建高度定制的日志消息。
  • 基本混淆 HTTP 客户端请求中的凭据
  • 根据内容类型白名单修剪响应体内容到特定长度
  • 变体 1: 全局日志记录(默认值)
    • 零配置:此软件包中默认启用全局日志记录。
    • 使用 RequestSending / ResponseReceived 事件监听器实现简单且高效
    • 混淆请求中传递的常见凭据(例如,Authorization 头的 Bearer 令牌)
  • 变体 2: 混合HTTP_CLIENT_GLOBAL_LOGGER_MIXIN=true
    • 仅在使用 Http::log() 的单个 HTTP 客户端实例上启用,不进行全局日志记录。
    • 可以通过将名称传递给 Http::log($name) 来设置每个 HTTP 客户端实例的日志通道名称
  • 变体 3: 全局 HTTP 中间件
    • 可以在您的 AppServiceProviderboot() 方法中与其他 Http::globalRequestMiddleware() 调用一起使用,在注册您的 全局中间件 之后。

使用方法

注意:对于下面所有的 3 个变体,您需要保持 HTTP 客户端全局日志记录器启用(不要在您的 .env 中设置 HTTP_CLIENT_GLOBAL_LOGGER_ENABLED=false)。http-client-global-logger.enabled 配置选项是所有 3 个变体的全局开/关切换,而不仅仅是“全局”变体。我们的项目名称可能在这方面具有误导性。

变体 1: 全局日志记录

只需像往常一样使用Laravel HTTP客户端 - 无需进行任何配置!

Http::get('https://example.com');

稍微复杂一点的例子

$client = Http::withOptions([
    'base_uri'        => 'https://example.com',
    'allow_redirects' => false,
]);
$response = $client->get('/user');

变体2:Mixin变体

如果您启用Mixin变体,全局日志将关闭。将以下内容放入您的.env

HTTP_CLIENT_GLOBAL_LOGGER_MIXIN=true

然后,您可以使用log()方法逐个在HTTP客户端实例上打开日志记录

Http::log()->get('https://example.com');

使用自定义通道名称进行日志记录(如果未指定,默认为当前环境,例如productionlocal

Http::log('my-api')->get('https://example.com');

稍微复杂一点的例子

$client = Http::log('my-api')->withOptions([
    'base_uri'        => 'https://example.com',
    'allow_redirects' => false,
]);
$response = $client->get('/user');

变体 3: 全局 HTTP 中间件

如果您使用全局中间件Http::globalRequestMiddleware()Http::globalResponseMiddleware()方法),请注意,变体1使用Laravel的RequestSending事件来记录HTTP请求。此事件在全局中间件执行之前触发。因此,全局中间件对请求进行的任何修改都不会被记录。为了克服这个问题,此包提供了一个您可以在全局中间件之后添加的中间件。

您可以使用HttpClientLogger类的静态addRequestMiddleware()方法添加中间件

use Onlime\LaravelHttpClientGlobalLogger\HttpClientLogger;

HttpClientLogger::addRequestMiddleware();

例如,您可以在注册全局中间件后,将以下内容添加到AppServiceProviderboot()方法中

use Illuminate\Support\Facades\Http;
use Onlime\LaravelHttpClientGlobalLogger\HttpClientLogger;

Http::globalRequestMiddleware(fn ($request) => $request->withHeader(
    'User-Agent', 'My Custom User Agent'
));

HttpClientLogger::addRequestMiddleware();

日志记录示例

默认情况下,日志将写入单独的日志文件http-client.log

日志条目示例

[2021-07-11 11:29:58] local.INFO: REQUEST: GET https://example.com/user
GET /user HTTP/1.1
User-Agent: GuzzleHttp/7
Host: example.com
Authorization: Bearer *******************
[2021-07-11 11:29:58] local.INFO: RESPONSE: HTTP/1.1 200 OK
HTTP/1.1 200 OK
Date: Fri, 18 Jun 2021 09:29:58 GMT
Server: nginx
Content-Type: application/json
{"username":"foo","email":"foo@example.com"}

常见问题解答

此包与bilfeldt/laravel-http-client-logger有何不同?

老实说,我没有深入研究bilfeldt/laravel-http-client-logger,因为我的主要目标是构建一个没有额外体积的全局Laravel HTTP客户端记录器。截至2021年7月,全局日志记录仍然是一个未解决的问题,请参阅bilfeldt/laravel-http-client-logger#2 - Add global logging

这两个包提供不同的功能集,并且有这些优势

因此,我的建议是:如果您需要无需额外配置且不修改项目中任何一行代码的全局日志记录,请使用我的包。如果您不想记录所有内容并且希望通过HTTP响应代码进行过滤,请使用Bilfeldt的包。但不要安装两个!

注意事项

  • 此包目前使用两种不同的日志记录实现。在首选的变体1或3(全局日志记录)中,目前无法配置日志通道名称,默认为当前环境,例如productionlocal。如果您想使用Laravel HTTP客户端访问多个不同的外部API,并且希望通过不同的日志通道名称来区分它们,这会很不错。

    作为一个解决方案,我实现了另一种通过Http::log()方法作为mixin进行日志记录的方法。但当然,我们应该将这两种变体合并为一个,以获得更干净的代码库。

  • 混淆

    • 主体键:使用带有后视断言的正则表达式提供非常基本的混淆支持(例如,/(?<="token":").*(?=")/mU,修改格式化的日志输出。目前无法直接修改请求体中的JSON数据。

    • 查询参数没有混淆,例如在POST请求到OAuth2令牌端点时。

    • 混淆目前仅在变体1或3(全局日志记录)中起作用,并且仅适用于请求,尚未适用于响应数据。

测试

目前,代码/测试覆盖率非常基础。我们正在使用PEST,所以只需像这样运行所有测试

$ ./vendor/bin/pest

变更

所有变更已列在变更日志

作者

❤️Philip Iezzi (Onlime GmbH)制作。

许可证

此软件包采用MIT许可证许可,然而,我们也非常欢迎提供支持。