dotkernel/dot-log

扩展并自定义 laminas-log 的 DotKernel 日志组件

4.0.4 2024-09-13 10:30 UTC

README

OSS Lifecycle PHP from Packagist (specify version)

GitHub issues GitHub forks GitHub stars GitHub license

Build Static codecov

SymfonyInsight

添加配置提供者

  • 进入 config/config.php
  • 如果以下没有配置提供者条目,请添加它:\Dot\Log\ConfigProvider::class
  • 确保它在 Application-Specific 组件之前添加,例如:\Frontend\App\ConfigProvider.php\Admin\App\ConfigProvider::classMyProject\ConfigProvider::class 等。
  • 打开 Dot\Log\ConfigProvider
  • 在依赖关系部分,您将看到一个抽象工厂(LoggerAbstractServiceFactory::class
  • 此类对“选择器”而不是类名做出响应。在容器中请求 Dot\Log\Logger::class 而不是请求 dot-log.my_logger

配置写入器

日志必须至少有一个写入器。

写入器是一个继承自 Dot\Log\Writer\AbstractWriter 的对象。写入器的责任是将日志数据记录到存储后端。

写入到文件(流)

使用写入器和过滤器可以将日志分开到多个文件中。例如 warnings.logerrors.logall_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()');

摘自这篇文章