kodus/chrome-logger

PSR-3 (日志记录), PSR-7 (HTTP) 和 PSR-15 (中间件) 兼容的 PHP 原始 ChromeLogger 替代方案

1.2.0 2022-08-24 10:44 UTC

This package is auto-updated.

Last update: 2024-08-25 12:04:44 UTC


README

PHP Version Build Status Code Coverage

由 Craig Campbell 开发的 PHP 原始 ChromeLogger 的替代方案,使用

  • PSR-3 兼容的日志记录接口、
  • PSR-7 HTTP 消息抽象模型,以及
  • PSR-15 兼容的中间件以实现快速集成。

✨ 另一种替代方案是 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 值都将进行序列化以便客户端检查 - 包括复杂对象图以及显式序列化像 ExceptionDateTime 这样的有问题类型。

头部大小限制

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() 调用。