onlime / laravel-http-client-global-logger
Laravel HTTP 客户端的全球日志记录器
Requires
- php: ^8.1
- illuminate/http: ^10.32|^11.0
- illuminate/support: ^10.0|^11.0
- monolog/monolog: ^3.0
Requires (Dev)
- laravel/framework: ^10.0|^11.0
- laravel/pint: ^1.13
- orchestra/testbench: ^8.8|^9.0
- pestphp/pest: ^2.33
- pestphp/pest-plugin-arch: ^2.0
- pestphp/pest-plugin-laravel: ^2.0
- saloonphp/laravel-http-sender: ^2.0|^3.0
- saloonphp/laravel-plugin: ^3.0
- spatie/invade: ^2.0
Suggests
- saloonphp/laravel-plugin: To support logging of Saloon events (^3.0)
README
一个为 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 中间件
- 可以在您的
AppServiceProvider
的boot()
方法中与其他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');
使用自定义通道名称进行日志记录(如果未指定,默认为当前环境,例如production
或local
)
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();
例如,您可以在注册全局中间件后,将以下内容添加到AppServiceProvider
的boot()
方法中
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。
这两个包提供不同的功能集,并且有这些优势
- onlime/laravel-http-client-global-logger(此包)
- 全局日志记录
- 自动配置日志通道
http-client
以记录到单独的http-client.log
文件 - 完全支持 Guzzle MessageFormatter 变量替换,以创建高度定制的日志消息。
- HTTP客户端请求中凭证的基本混淆
- 修剪响应体内容
- bilfeldt/laravel-http-client-logger
- 使用
logWhen($condition)
进行条件日志记录 - 通过HTTP响应代码过滤日志
- 目前仍然支持PHP 7.4+
- 使用
因此,我的建议是:如果您需要无需额外配置且不修改项目中任何一行代码的全局日志记录,请使用我的包。如果您不想记录所有内容并且希望通过HTTP响应代码进行过滤,请使用Bilfeldt的包。但不要安装两个!
注意事项
-
此包目前使用两种不同的日志记录实现。在首选的变体1或3(全局日志记录)中,目前无法配置日志通道名称,默认为当前环境,例如
production
或local
。如果您想使用Laravel HTTP客户端访问多个不同的外部API,并且希望通过不同的日志通道名称来区分它们,这会很不错。作为一个解决方案,我实现了另一种通过
Http::log()
方法作为mixin进行日志记录的方法。但当然,我们应该将这两种变体合并为一个,以获得更干净的代码库。 -
混淆
-
主体键:使用带有后视断言的正则表达式提供非常基本的混淆支持(例如,
/(?<="token":").*(?=")/mU
,修改格式化的日志输出。目前无法直接修改请求体中的JSON数据。 -
查询参数没有混淆,例如在POST请求到OAuth2令牌端点时。
-
混淆目前仅在变体1或3(全局日志记录)中起作用,并且仅适用于请求,尚未适用于响应数据。
-
测试
目前,代码/测试覆盖率非常基础。我们正在使用PEST,所以只需像这样运行所有测试
$ ./vendor/bin/pest
变更
所有变更已列在变更日志中
作者
由❤️Philip Iezzi (Onlime GmbH)制作。
许可证
此软件包采用MIT许可证许可,然而,我们也非常欢迎提供支持。