mefworks / log
PSR-3 兼容的日志记录器。
Requires
- php: >=7.0
- ext-json: *
- mefworks/string-interpolation: ~1.0
- psr/log: ~1.0
Requires (Dev)
- phpunit/phpunit: ^9.0
Provides
- psr/log-implementation: 1.0.0
This package is auto-updated.
Last update: 2024-09-21 23:43:02 UTC
README
mef\Log 是一个针对 PHP 5.5+ 的 PSR-3 兼容日志记录器,旨在尽可能快的同时不牺牲有用的功能。所有功能都整齐地存储在单独的层中,因此您不会因不需要或使用的功能而受到惩罚。(例如,核心日志方法仅由两个简单的 if 语句和调用处理器的日志方法组成。)
示例
输出到 stdout/stderr
<?php
$logger = new \mef\Log\StandardLogger;
// string interpolation works as expected
$logger->notice('This will go to {0}.', ['stdout']);
$logger->error('This will go to {location}.', ['location' => 'stderr']);
输出到文件
<?php
$fileHandler = new \mef\Log\Handler\FileHandler('/var/log/my.log');
$logger = new \mef\Log\StandardLogger($fileHandler);
$logger->notice('This will go to /var/log/my.log');
多个处理器,带过滤
<?php
$debugHandler = new \mef\Log\Handler\Stdout;
$debugHandler->filterHigherThan(Psr\Log\LogLevel::DEBUG);
$fileHandler = new \mef\Log\Handler\FileHandler('/var/log/my.log');
$fileHandler->filterLowerThan(Psr\Log\LogLevel::INFO);
// The handlers could be pushed in any order. Here we are pushing the
// $fileHandler first because in production, there shouldn't be any
// debug messages, and the 'true' parameter will cause the chain handler
// to break early (thus skipping the debug handler) for any message that
// isn't marked DEBUG
$chainHandler = new \mef\Log\Handler\ChainHandler;
$chainHandler->pushHandler($fileHandler, true);
$chainHandler->pushHandler($debugHandler);
$logger = new \mef\Log\StandardLogger($chainHandler);
$logger->notice('This will go to /var/log/my.log');
$logger->debug('This will go to stdout');
更完整的示例可以在 examples
目录中找到。
概述
根据定义,有六个主要对象:
mef\Log\Logger
- 这是您与之交互最多的核心日志记录器对象。它是 PSR-3 兼容的,因此您可以轻松地与大多数框架一起使用。记录器将大部分工作分配给实现HandlerInterface
和EntryFactoryInterface
接口的对象,但子类\mef\Log\StandardLogger
具有合理的默认值,以避免设置一切的麻烦。\mef\Log\Handler\HandlerInterface
- 一个执行对条目某些操作的对象。条目对处理器是只读的。它们旨在执行一些有用的操作,例如将条目记录到文件中。\mef\Log\Entry\EntryFactoryInterface
- 一个构建日志条目对象(实现EntryInterface
)的对象。\mef\Log\Entry\EntryInterface
- 日志消息在通过工厂将其封装到对象之后。这是传递给处理器的。每个日志条目都有一个时间戳、一个错误级别、一条消息、上下文(一个包含任意数据的数组)。\mef\Log\Processor\ProcessorInterface
- 在处理器处理日志条目之前修改日志条目。处理器可以更改消息或更改上下文。\mef\Log\Formatter\FormatterInterface
- 将日志条目格式化为处理器可以使用的内容。例如,如果使用基于流的格式化程序,则您将使用返回字符串的格式化程序。
日志记录器始终恰好有一个处理器。不可能直接附加多个处理器,也不可能在没有处理器的情况下运行它。但是,如果您需要这些功能中的任何一个,那么 ChainHandler
和 NullHandler
都是现成的。
一旦创建日志条目(通过调用 $logger->debug、info、warning 等...),日志记录器首先检查是否想要处理该级别。如果不是,则不执行任何操作。(这是通过 FilterTrait
实现的。)在日志记录器级别进行过滤是忽略消息的最高效方式。
假设日志记录器没有过滤掉消息,它将被包装到 \mef\Log\Entry\EntryInterface
对象中,并发送到处理器。如果使用 EntryFactory
且处理器忽略消息,则不会执行字符串插值。然而,总是调用处理程序。
如果处理器对日志条目执行了一些操作,则对消息执行字符串插值(将 $context
数组的一部分嵌入到消息中)。然后处理器可以对条目执行自己的特殊格式化(例如,添加时间戳和严重级别)。
处理器
异类
NullHandler
- 不做任何事情。除了测试之外,这实际上没有用途。如果您在某些情况下不想记录任何内容,可以将其附加为处理器,但您应该仍然在基本的Logger
实例中过滤出所有级别,以实现最佳性能。
装饰器
ChainHandler
- 将单个条目分发到多个处理器。FinalStrawHandler
- 将所有日志条目缓存,直到达到一定的严重程度。一旦达到,所有条目将作为一个批次传递给子处理器。
基于流
StreamHandler
- 将日志记录到任何PHP流。FileHandler
- 将日志记录到文件。StderrHandler
- 将日志记录到stderr(控制台)。StdOutHandler
- 将日志记录到stdout(控制台)。OutputHandler
- 将日志记录到PHP的输出缓冲区
其他
MemoryHandler
- 将日志记录到内存中的队列。
处理器
ChainProcessor
- 将单个条目分配给多个处理器。MemoryProcessor
- 将内存使用情况添加到上下文中。NullProcessor
- 不做任何事情。
格式化器
CallbackFormatter
- 将任何可调用的对象转换为格式化器。JsonFormatter
- 格式化为JSON字符串。NullFormatter
- 返回null(实际上使日志记录变得不可能)StringFormatter
- 使用自定义格式的字符串插值器将条目格式化为字符串。
许可证
版权所有 (C) 2014-2022 Matthew Leverton
特此授予任何获得本软件及其相关文档文件(“软件”)副本的个人免费使用软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许获得软件的个人这样做,前提是符合以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
软件按“原样”提供,不提供任何形式的保证,无论是明示的、暗示的还是法定保证,包括但不限于适销性、特定目的适用性和非侵权性。在任何情况下,作者或版权持有人不对任何索赔、损害或其他责任负责,无论这些责任是因合同、侵权或其他原因引起的,无论这些责任是与软件或其使用或其他方式相关还是由此产生。