phossa2 / logger
PHP的PSR-3兼容日志库
Requires
- php: >=5.4.0
- phossa2/shared: ^2.0.21
- psr/log: ^1.0
Requires (Dev)
- phpunit/phpunit: 4.*
Provides
- psr/log-implementation: 1.0.0
Replaces
This package is not auto-updated.
Last update: 2020-01-22 03:52:01 UTC
README
请使用 phoole/logger 库代替
phossa2/logger 是一个符合 PSR-3 的日志库。它是 Monolog 的重写,并做了一些修改。
它需要 PHP 5.4,支持 PHP 7.0+ 和 HHVM。它符合 PSR-1、PSR-2、PSR-3、PSR-4,以及提议的 PSR-5。
安装
通过 composer
工具安装。
composer require "phossa2/logger=2.*"
或者将以下行添加到您的 composer.json
{ "require": { "phossa2/logger": "2.*" } }
使用
使用默认通道创建日志实例,
use Phossa2\Logger\Logger; use Phossa2\Logger\Handler\SyslogHandler; use Phossa2\Logger\Handler\LogfileHandler; use Phossa2\Logger\Processor\MemoryProcessor; use Phossa2\Logger\Processor\InterpolateProcessor; // with default channel $logger = new Logger('MyApp'); // attach memory processor $logger->addProcessor(new MemoryProcessor()); // attach interpolate processor to all channels' ('*') end (-100) $logger->addProcessor(new InterpolateProcessor(), '*', -100); // attach syslog handler to user related channels $logger->addHandler('debug', new SyslogHandler(), 'user.*'); // attach file handler to all channels $logger->addHandler('warning', new LogfileHandler('/tmp/app.log')); // log to system.usage channel $logger ->with('system.usage') ->debug('memory used {memory.used} and peak is {memory.peak}'); // log to user.login channel $logger ->with('user.login') ->info('user logged in as {user.username}', ['user' => $user]); // log to default channel $logger->debug('a test message');
特性
-
通道的创造性使用。现在
Handler
和Processor
可以绑定到不同的通道,也可以使用通道名称globbing。-
通道globbing
默认情况下,处理器和处理器绑定到
'*'
通道,它匹配所有。但它们也可以绑定到如'user.*'
或更具体的'user.login'
通道。// bind to 'user.*' channels $logger->addHandler('warning', new LogfileHandler('/log/user.log'), 'user.*'); // bind to 'system.*' channels $logger->addHandler('error', new LogfileHandler('/log/system.log'), 'system.*'); // add user info only in 'user.*' channel $logger->addProcessor(new UserProcessor(), 'user.*');
可以通过在任意日志相关方法前使用
with()
来向特定通道发送日志消息,如log()
、warning()
等。$logger->with('user.login')->info('user {user.username} logged info');
前一个代码中的
info()
方法将触发通过UserProcessor
插入到上下文数组中的用户信息并被记录到文件/log/user.log
。注意:通道名称不区分大小写。
注意:相同的处理器或处理器可以绑定到不同的通道。但在一个日志调用中只会执行一次。
-
单个日志记录器
由于支持向不同通道记录,因此在一个应用程序中不需要创建多个日志记录器。通过精心设计您的通道层次结构,您可能在整个网站上使用一个日志记录器。
-
-
现在可以将处理器和处理器注入到日志记录器中,带有不同的优先级(范围从
-100
到100
,默认为0
)。-
更高的优先级意味着先执行
// add user info at first $logger->addProcessor(new UserProcessor(), 'user.*', 100); // interpolate should be done last (just before executing handlers) $logger->addProcessor(new InterpolateProcessor(), '*', -100);
-
相同优先级的第一个先执行(执行)
默认优先级值为
0
。以下处理器按照添加的顺序执行。// log to file first $logger->addHandler('debug', new LogfileHandler('/log/log.txt')); // then log to mail $logger->addHandler('debug', new MailHandler('[email protected]'));
-
-
处理器、格式化程序、处理器现在都使用单个接口
public function __invoke(LogEntryInterface $logEntry);
这意味着,用户可以使用预定义的函数或其他可调用对象作为处理器、格式化程序或处理器,只要这些可调用对象接受
LogEntryInterface
作为参数。以下是一个快速处理器示例,
function myHandler(LogEntryInterface $logEntry) { // get formatted message $formatted = $logEntry->getFormatted(); // write to my device ... }
或者甚至是,
$logger->addHandler('error', function($log) { // write the log to my device }, 'user.*');
-
不再使用数组作为日志消息的数据类型。定义了
LogEntryInterface
作为日志的默认数据类型。您甚至可以扩展
LogEntry
类,并在您的日志记录器中使用它class MyLogEntry extends LogEntry { // ... }
将其作为所有日志消息的原型在您的日志记录器中使用
$entryPrototype = new MyLogEntry('channel','debug', 'message'); $logger = new Logger('MyApp', $entryPrototype);
APIs
-
有关相关API的标准,请参阅PSR-3。
-
-
__construct(string $defaultChannel = 'LOGGER', LogEntryInterface $logPrototype = null)
创建日志记录器。
-
with(string $channel): $this
指定即将到来的日志方法的通道。
-
addHandler(string $level, callable $handler, string $channel = '*', int $priority = 0): $this
以优先级添加一个处理程序到指定的通道。
-
addProcessor(callable $processor, string $channel = '*', int $priority = 0): $this
以优先级添加一个处理程序到指定的通道。
-
removeHandler(callable|string $handlerOrClassname, $channel = '')
从指定通道删除处理程序(或指定处理程序的类名)。如果
$channel
为空,则从所有通道中删除。 -
removeProcessor(callable|string $processorOrClassname, $channel = '')
从指定通道删除处理程序(或指定处理程序的类名)。如果
$channel
为空,则从所有通道中删除。
-
变更日志
有关更多信息,请参阅CHANGELOG。
测试
$ composer test
贡献
有关更多信息,请参阅CONTRIBUTE。
依赖
-
PHP >= 5.4.0
-
phossa2/shared >= 2.0.21