dotkernel / dot-log
扩展并自定义 laminas-log 的 DotKernel 日志组件
Requires
- php: ~8.1.0 || ~8.2.0 || ~8.3.0
- laminas/laminas-servicemanager: ^3.22
- laminas/laminas-validator: ^2.64
Requires (Dev)
- laminas/laminas-coding-standard: ^2.5
- phpunit/phpunit: ^10.2
- vimeo/psalm: ^5.13
This package is auto-updated.
Last update: 2024-09-13 10:40:10 UTC
README
添加配置提供者
- 进入 config/config.php
- 如果以下没有配置提供者条目,请添加它:
\Dot\Log\ConfigProvider::class
- 确保它在 Application-Specific 组件之前添加,例如:
\Frontend\App\ConfigProvider.php
、\Admin\App\ConfigProvider::class
、MyProject\ConfigProvider::class
等。 - 打开
Dot\Log\ConfigProvider
- 在依赖关系部分,您将看到一个抽象工厂(
LoggerAbstractServiceFactory::class
) - 此类对“选择器”而不是类名做出响应。在容器中请求
Dot\Log\Logger::class
而不是请求dot-log.my_logger
配置写入器
日志必须至少有一个写入器。
写入器是一个继承自 Dot\Log\Writer\AbstractWriter
的对象。写入器的责任是将日志数据记录到存储后端。
写入到文件(流)
使用写入器和过滤器可以将日志分开到多个文件中。例如 warnings.log、errors.log、all_messages.log。
以下是将所有日志消息写入 /log/dk.log
的最简单示例
return [ 'dot_log' => [ 'loggers' => [ 'my_logger' => [ 'writers' => [ 'FileWriter' => [ 'name' => 'FileWriter', 'priority' => \Dot\Log\Manager\Logger::ALERT, // this is equal to 1 'options' => [ 'stream' => __DIR__ . '/../../log/dk.log', ], ], ], ] ], ], ];
FileWriter
键是可选的,否则写入器数组将是枚举的而不是关联的。- 写入器名称键是开发者提供的该写入器的名称,写入器名称键是 必需的。
写入器优先级键不影响写入的错误,它是一种组织写入器的方式。
写入器优先级键是可选的。
要将数据写入文件,必须在写入器选项数组中存在键 stream。仅当写入流/文件时才需要此功能。
按日期分组日志文件
默认情况下,日志将写入同一个文件:log/dk.log
。可选地,您可以在 FileWriter 的 stream
选项中使用大括号包围的日期格式说明符,自动按天、周、月、年等分组日志。示例
log/dk-{Y}-{m}-{d}.log
将每天写入不同的文件(例如:log/dk-2021-01-01.log
)log/dk-{Y}-{W}.log
将每周写入不同的文件(例如:log/dk-2021-10.log
)
完整的格式说明符列表可在 此处 查看。
过滤日志消息
根据 PSR-3 文档。
日志级别为:紧急(0)、警报(1)、关键(2)、错误(3)、警告(4)、通知(5)、信息(6)、调试(7)(按优先级/重要性排序)
虽然 Dot Log 中的普通 Logger 与 PSR-3 不完全兼容,但它提供了一种记录所有这些消息类型的方法。
以下示例有三个使用过滤器的文件写入器
- 第一个示例:
FileWriter
- 所有消息都记录在/log/dk.log
- 第二个示例:
OnlyWarningsWriter
- 只有警告记录在/log/warnings.log
- 第三个示例:
WarningOrHigherWriter
- 所有重要消息(warnings
或更关键)都记录在/log/important_messages.log
<?php return [ 'dot_log' => [ 'loggers' => [ 'my_logger' => [ 'writers' => [ 'FileWriter' => [ 'name' => 'FileWriter', 'priority' => \Dot\Log\Manager\Logger::ALERT, 'options' => [ 'stream' => __DIR__ . '/../../log/dk.log', 'filters' => [ 'allMessages' => [ 'name' => 'priority', 'options' => [ 'operator' => '>=', 'priority' => \Dot\Log\Manager\Logger::EMERG, ] ], ], ], ], // Only warnings 'OnlyWarningsWriter' => [ 'name' => 'stream', 'priority' => \Dot\Log\Manager\Logger::ALERT, 'options' => [ 'stream' => __DIR__ . '/../../log/warnings_only.log', 'filters' => [ 'warningOnly' => [ 'name' => 'priority', 'options' => [ 'operator' => '==', 'priority' => \Dot\Log\Manager\Logger::WARN, ], ], ], ], ], // Warnings and more important messages 'WarningOrHigherWriter' => [ 'name' => 'stream', 'priority' => \Dot\Log\Manager\Logger::ALERT, 'options' => [ 'stream' => __DIR__ . '/../../log/important_messages.log', 'filters' => [ 'importantMessages' => [ 'name' => 'priority', 'options' => [ // note, the smaller the priority, the more important is the message // 0 - emergency, 1 - alert, 2- error, 3 - warn. .etc 'operator' => '<=', 'priority' => \Dot\Log\Manager\Logger::WARN, ], ], ], ], ], ], ], ], ], ];
与写入器配置一样,开发人员可以选择使用键将过滤器与名称关联。
重要提示:更重要消息的运算符是 <=,这是因为更重要消息类型的数值表示更小。
第一个添加的过滤器相当于未设置过滤器,但添加它只是为了说明如何显式允许所有消息。
为了演示其他操作符也是一个选项,它被添加与其它相反。
消息格式化
当使用 dot-log
时,记录的值不仅限于字符串。数组也可以被记录。
为了更好的可读性,这些数组可以被序列化。
Dot Log 提供字符串格式化和 JSON 格式化。
格式化器接受以下参数
name - 格式化器类(它必须实现 Dot\Log\Formatter\FormatterInterface
)
options - 如果需要,传递给格式化器构造函数的选项
'formatter' => [ 'name' => \Dot\Log\Manager\Formatter\Json::class, ],
以下将消息格式化为 JSON 数据
- 以下是与格式化器的示例
- 日志通过 dot-log 使用
- 日志名称为 my_logger
- 写入文件:log/dk.log
- 显式允许所有消息被写入
<?php return [ 'dot_log' => [ 'loggers' => [ 'my_logger' => [ 'writers' => [ 'FileWriter' => [ 'name' => 'FileWriter', 'priority' => \Dot\Log\Manager\Logger::ALERT, 'options' => [ 'stream' => __DIR__ . '/../../log/dk.log', // explicitly log all messages 'filters' => [ 'allMessages' => [ 'name' => 'priority', 'options' => [ 'operator' => '>=', 'priority' => \Dot\Log\Manager\Logger::EMERG, ], ], ], 'formatter' => [ 'name' => \Dot\Log\Manager\Formatter\Json::class, ], ], ], ], ], ], ], ];
格式化为 JSON
以下是日志器的基本用法。
消息被写入以查看哪些日志被写入,哪些没有被写入。
use Dot\Log\Manager\Logger;
...
$logger = $container->get('dot-log.my_logger'); /** @var Logger $logger */ $logger->emerg('0 EMERG'); $logger->alert('1 ALERT'); $logger->crit('2 CRITICAL'); $logger->err('3 ERR'); $logger->warn('4 WARN'); $logger->notice('5 NOTICE'); $logger->info('6 INF'); $logger->debug('7 debug'); $logger->log(Logger::NOTICE, 'NOTICE from log()');
摘自这篇文章