kodus / chrome-logger
PSR-3 (日志记录), PSR-7 (HTTP) 和 PSR-15 (中间件) 兼容的 PHP 原始 ChromeLogger 替代方案
Requires
- php: >=8.0
- psr/http-message: ^1
- psr/http-server-middleware: ^1
- psr/log: ^1
Requires (Dev)
- codeception/codeception: ^5
- codeception/module-asserts: ^3
- mindplay/middleman: ^4
- mockery/mockery: ^1.5
- nyholm/psr7: ^1.5
README
由 Craig Campbell 开发的 PHP 原始 ChromeLogger 的替代方案,使用
✨ 另一种替代方案是 ChromeLogger 扩展,并且强烈推荐使用。
用法
日志接口符合 PSR-3 标准,因此
$logger = new ChromeLogger(); $logger->notice("awesome sauce!");
请注意,默认情况下,这将有一个 头部大小限制。
使用符合 PSR-7 的 ResponseInterface
实例,例如在中间件堆栈中,你可以按如下方式填充响应
$response = $logger->writeToResponse($response);
或者只需将包含的 PSR-15 ChromeLoggerMiddleware
实例添加到中间件堆栈的顶部。
如果你不使用 PSR-7,也可以使用 ChromeLogger::emitHeader()
以老式的方式发出头。
日志表数据
由于 PSR-3 没有提供对表的任何明确支持,我们通过上下文数组支持表格。
例如
$logger->info( "INFO", [ "table: SQL Queries" => [ ["time" => "10 msec", "sql" => "SELECT * FROM foo"], ["time" => "20 msec", "sql" => "SELECT * FROM baz"], ] ] );
这之所以有效,是因为上下文数组中的 "table:"
键前缀被识别并特别处理。
从异常中记录堆栈跟踪
PSR-3 上下文值中的保留键 "exception"
受支持 - 下面的示例将生成堆栈跟踪
try { something_dumb(); } catch (Exception $e) { $logger->error("ouch, this looks bad!", ["exception" => $e]); }
通过上下文数组注入的任何 PHP 值都将进行序列化以便客户端检查 - 包括复杂对象图以及显式序列化像 Exception
和 DateTime
这样的有问题类型。
头部大小限制
Chrome 有 250KB 的头部大小限制,许多流行的 Web 服务器(包括 NGINX 和 Apache)也有限制。
默认情况下,日志的开始部分将被截断以保持头部大小在限制以下。
你可以使用 ChromeLogger::setLimit()
方法更改此限制 - 但更好的方法是启用对本地文件的日志记录,这将使日志在一个可由 Web 访问的文件夹中持续 60 秒。
$logger->usePersistence("/var/www/mysite/webroot/logs", "/logs");
请注意,这不受 ChromeLogger 扩展的支持 - 你需要安装替代的 Server Log Chrome 扩展。 (它与原始 ChromeLogger 扩展的头部格式向后兼容,因此可以作为原始扩展的替代品使用。)
限制
我们目前不支持日志条目分组,这是原始 PHP ChromeLogger 支持的概念,因为 PSR-3 不支持此概念。
我们不会使用在ChromeLogger中用于给对象着色的保留键 '___class_name'
,因为这在嵌套对象图中不起作用。相反,我们在控制台输出中一致地用 type
来表示对象类型,这在对象属性以 $
前缀在输出中视觉上区分的情况下已经足够好了。要改进这一点,未来需要对ChromeLogger扩展进行更改。
为什么?
PHP原始的ChromeLogger有一个静态API,并且会积极地发出头部信息,这使得它不适合用于基于PSR-15(或其它)的中间件栈。如果你喜欢编写可测试的代码,静态类通常并不有趣。
这个库也实现了PSR-3的 LoggerInterface
,这使得替换为任何其他日志记录器变得很容易。
请注意,虽然我们知道流行的日志框架 monolog 中包含了 ChromePHPHandler
,但 kodus/chrome-logger
除了PSR接口外没有外部依赖,并且使用 ResponseInterface::withHeader()
来填充PSR-7响应对象,而不是进行 header()
调用。