corpus/loggers

有用的PSR-3实用日志记录器

v0.4.0 2024-01-19 23:22 UTC

README

Latest Stable Version License ci.yml

PSR-3: 日志接口的日志记录器和工具。

  • LogLevelFilter - LogLevelFilter 是一个基于日志级别的 PSR 日志记录器,可以根据日志级别过滤日志。它可以用来过滤掉特定用例中不需要的日志消息。
  • LogLevelLoggerMux - LogLevelLoggerMux 是一个基于日志级别的 PSR 日志记录器,根据日志级别将日志多路复用到不同的日志记录器。
  • LoggerVerbosityFilter - LoggerVerbosityFilter 根据给定的整数详细级别静音日志消息。
  • LoggerWithContext - LoggerWithContext 是一个在委派给另一个日志记录器之前,将给定上下文添加到所有日志消息中的日志记录器。
  • MemoryLogger - MemoryLogger 是一个将所有日志存储在本地内存中的 PSR 日志记录器。
  • MultiLogger - MultiLogger 是一个将日志委派给多个其他日志记录器的 PSR 日志记录器。
  • StreamResourceLogger - StreamResourceLogger 是一个将日志写入流资源的 PSR 日志记录器。

要求

  • psr/log: ^1 || ^2 || ^3
  • php: ^7.4 || ^8.0

安装

使用以下命令安装最新版本:

composer require 'corpus/loggers'

示例

此示例演示了如何将日志记录器链接在一起以创建复杂交互。

<?php

use Corpus\Loggers\LoggerWithContext;
use Corpus\Loggers\LogLevelFilter;
use Corpus\Loggers\MemoryLogger;
use Corpus\Loggers\MultiLogger;
use Corpus\Loggers\StreamResourceLogger;
use Psr\Log\LogLevel;

require __DIR__ . '/../vendor/autoload.php';

$memoryLogger = new MemoryLogger;
$cliLogger    = new StreamResourceLogger(
	fopen('php://output', 'w')
);

$logger = new MultiLogger(
	new LogLevelFilter(
		(new LoggerWithContext($memoryLogger))->withContext([ 'Logger' => 'Number 1' ]),
		[ Psr\Log\LogLevel::INFO ]
	),
	new LogLevelFilter(
		(new LoggerWithContext($cliLogger))->withContext([ 'Logger' => 'Number 2' ]),
		[ Psr\Log\LogLevel::INFO, LogLevel::DEBUG ]
	),
	new LogLevelFilter(
		(new LoggerWithContext($cliLogger))->withContext([ 'Logger' => 'Number 3' ]),
		[ Psr\Log\LogLevel::INFO, LogLevel::DEBUG ],
		true // reverse filter - only log levels NOT in the array
	)
);

$logger->info('Hello World', [ 'hello' => 'world' ]);
$logger->debug('How are you?', [ 'foo' => 'bar' ]);
$logger->error('I am fine', [ 'bar' => 'baz', 'baz' => 'qux' ]);

echo "\n--- dumping memory logger ---\n\n";

var_export($memoryLogger->getLogs());
2023-11-30T05:34:35+00:00      info: Hello World
    Logger: 'Number 2'
     hello: 'world'
2023-11-30T05:34:35+00:00     debug: How are you?
    Logger: 'Number 2'
       foo: 'bar'
2023-11-30T05:34:35+00:00     error: I am fine
    Logger: 'Number 3'
       bar: 'baz'
       baz: 'qux'

--- dumping memory logger ---

array (
  0 =>
  array (
    'level' => 'info',
    'message' => 'Hello World',
    'context' =>
    array (
      'Logger' => 'Number 1',
      'hello' => 'world',
    ),
  ),
)

文档

类:\Corpus\Loggers\Interfaces\LoggerWithContextInterface

方法:LoggerWithContextInterface->withContext

function withContext(array $context) : self

返回具有给定上下文的新实例,替换现有的上下文。
replacing the existing context.

方法:LoggerWithContextInterface->withAddedContext

function withAddedContext(array $context) : self

返回具有给定上下文的新实例,替换现有的上下文。
添加到现有的上下文中。

类:\Corpus\Loggers\Interfaces\MultiLoggerInterface

方法:MultiLoggerInterface->withAdditionalLoggers

function withAdditionalLoggers(\Psr\Log\LoggerInterface ...$loggers) : self

withAdditionalLoggers 返回具有给定日志记录器的新实例
添加到委派的日志记录器列表中。

类:\Corpus\Loggers\Interfaces\WithAdditionalLoggersInterface

方法:WithAdditionalLoggersInterface->withAdditionalLoggers

function withAdditionalLoggers(\Psr\Log\LoggerInterface ...$loggers) : self

withAdditionalLoggers 返回具有给定日志记录器的新实例
添加到委派的日志记录器列表中。

类:\Corpus\Loggers\Interfaces\WithContextInterface

方法:WithContextInterface->withContext

function withContext(array $context) : self

返回具有给定上下文的新实例,替换现有的上下文。
replacing the existing context.

方法:WithContextInterface->withAddedContext

function withAddedContext(array $context) : self

返回具有给定上下文的新实例,替换现有的上下文。
添加到现有的上下文中。

类:\Corpus\Loggers\LoggerVerbosityFilter

LoggerVerbosityFilter 根据给定的整数详细级别静音日志消息。

默认情况下,

  • 级别 0 不记录消息。
  • 级别 1 记录紧急、警报、关键和错误消息。
  • 级别 2 记录紧急、警报、关键、错误、警告和通知消息。
  • 级别 3 记录紧急、警报、关键、错误、警告、通知和信息消息。
  • 级别 4 或更高记录紧急、警报、关键、错误、警告、通知、信息和调试消息。

可以通过传递一个回调来更改级别,重新定义每个日志级别的详细级别。

可以通过调用 withVerbosity() 来更改详细级别

方法:LoggerVerbosityFilter->__construct

function __construct(\Psr\Log\LoggerInterface $logger [, int $verbosity = 0 [, ?callable $verbosityFromLevelCallback = null]])
参数
  • callable | null $verbosityFromLevelCallback - 一个回调,它接受一个 Psr\Log\LogLevel 日志级别字符串并返回一个整数详细级别。如果为 null,则使用默认回调。

方法:LoggerVerbosityFilter->withVerbosity

function withVerbosity(int $verbosity) : self

返回具有指定详细级别的新实例。

方法:LoggerVerbosityFilter->withVerbosityFromLevelCallback

function withVerbosityFromLevelCallback(callable $verbosityFromLevelCallback) : self

返回具有指定详细级别回调的新实例。

类:\Corpus\Loggers\LoggerWithContext

LoggerWithContext 是一个在委派给另一个日志记录器之前,将给定上下文添加到所有日志消息中的日志记录器。

这对于添加上下文到所有日志消息很有用,例如当前请求 ID、IP 地址或当前用户 ID。

方法:LoggerWithContext->__construct

function __construct(\Psr\Log\LoggerInterface $logger [, array $context = []])

使用给定的日志记录器和上下文创建一个新的 LoggerWithContext 实例。

给定上下文将被添加到所有日志消息中。

参数
  • \Psr\Log\LoggerInterface $logger - 要委托的日志记录器。
  • 数组 $context - 要添加到所有日志消息中的上下文。

方法:LoggerWithContext->withContext

function withContext(array $context) : self

返回具有给定上下文的新实例,替换现有的上下文。
replacing the existing context.

方法:LoggerWithContext->withAddedContext

function withAddedContext(array $context) : self

返回具有给定上下文的新实例,替换现有的上下文。
添加到现有的上下文中。

类:\Corpus\Loggers\LogLevelFilter

LogLevelFilter是一个基于日志级别的PSR日志记录器。

它可以用来过滤掉特定用例中不需要的日志消息。

例如,你可能希望将所有DEBUG级别的消息记录到文件中,但只将ERROR级别或更高的消息记录到控制台。

此日志记录器可以用来从控制台日志记录器中过滤掉DEBUG消息。

此日志记录器接受要过滤的日志级别列表以及一个布尔值,表示是否排除或包含给定的日志级别。

方法:LogLevelFilter->__construct

function __construct(\Psr\Log\LoggerInterface $logger, array $levels [, bool $exclude = false])
参数
  • 字符串数组 $levels - 要过滤的日志级别。
  • 布尔值 $exclude - 是否排除给定的级别,或包含它们。

类:\Corpus\Loggers\LogLevelLoggerMux

LogLevelLoggerMux是一个基于日志级别将日志多路复用到不同日志记录器的PSR日志记录器。

方法:LogLevelLoggerMux->__construct

function __construct([ ?\Psr\Log\LoggerInterface $defaultLogger = null [, ?\Psr\Log\LoggerInterface $emergencyLogger = null [, ?\Psr\Log\LoggerInterface $alertLogger = null [, ?\Psr\Log\LoggerInterface $criticalLogger = null [, ?\Psr\Log\LoggerInterface $errorLogger = null [, ?\Psr\Log\LoggerInterface $warningLogger = null [, ?\Psr\Log\LoggerInterface $noticeLogger = null [, ?\Psr\Log\LoggerInterface $infoLogger = null [, ?\Psr\Log\LoggerInterface $debugLogger = null]]]]]]]]])
参数
  • \Psr\Log\LoggerInterface | null $defaultLogger - 对于未指定其他日志记录器的级别的默认日志记录器。如果为null,将使用Psr\Log\NullLogger。

方法:LogLevelLoggerMux->withEmergencyLogger

function withEmergencyLogger(\Psr\Log\LoggerInterface $logger) : self

返回一个新的实例,该实例使用指定的日志记录器处理Emergency日志级别。

方法:LogLevelLoggerMux->withAlertLogger

function withAlertLogger(\Psr\Log\LoggerInterface $logger) : self

返回一个新的实例,该实例使用指定的日志记录器处理Alert日志级别。

方法:LogLevelLoggerMux->withCriticalLogger

function withCriticalLogger(\Psr\Log\LoggerInterface $logger) : self

返回一个新的实例,该实例使用指定的日志记录器处理Critical日志级别。

方法:LogLevelLoggerMux->withErrorLogger

function withErrorLogger(\Psr\Log\LoggerInterface $logger) : self

返回一个新的实例,该实例使用指定的日志记录器处理Error日志级别。

方法:LogLevelLoggerMux->withWarningLogger

function withWarningLogger(\Psr\Log\LoggerInterface $logger) : self

返回一个新的实例,该实例使用指定的日志记录器处理Warning日志级别。

方法:LogLevelLoggerMux->withNoticeLogger

function withNoticeLogger(\Psr\Log\LoggerInterface $logger) : self

返回一个新的实例,该实例使用指定的日志记录器处理Notice日志级别。

方法:LogLevelLoggerMux->withInfoLogger

function withInfoLogger(\Psr\Log\LoggerInterface $logger) : self

返回一个新的实例,该实例使用指定的日志记录器处理Info日志级别。

方法:LogLevelLoggerMux->withDebugLogger

function withDebugLogger(\Psr\Log\LoggerInterface $logger) : self

返回一个新的实例,该实例使用指定的日志记录器处理Debug日志级别。

类:\Corpus\Loggers\MemoryLogger

MemoryLogger是一个将所有日志存储在本地内存中的PSR日志记录器。

这主要用于测试目的。

<?php
namespace Corpus\Loggers;

class MemoryLogger {
	public const KEY_LEVEL = 'level';
	public const KEY_MESSAGE = 'message';
	public const KEY_CONTEXT = 'context';
}

方法:MemoryLogger->getLogs

function getLogs() : array

getLogs返回已记录到该日志记录器的所有日志。

返回的数组是日志记录列表,每个记录都是一个键为数组的数组
  • MemoryLogger::KEY_LEVEL : 日志级别
  • MemoryLogger::KEY_MESSAGE : 日志消息
  • MemoryLogger::KEY_CONTEXT : 日志上下文
返回
  • 数组[]

方法:MemoryLogger->clearLogs

function clearLogs() : void

clearLogs清除已记录到该日志记录器的所有日志。

类:\Corpus\Loggers\MultiLogger

MultiLogger是一个将日志委托到多个其他日志记录器的PSR日志记录器。

方法:MultiLogger->__construct

function __construct(\Psr\Log\LoggerInterface ...$loggers)

使用给定的日志记录器创建一个新的MultiLogger实例。

方法:MultiLogger->withAdditionalLoggers

function withAdditionalLoggers(\Psr\Log\LoggerInterface ...$loggers) : self

withAdditionalLoggers 返回具有给定日志记录器的新实例
添加到委派的日志记录器列表中。

类:\Corpus\Loggers\StreamResourceLogger

StreamResourceLogger是一个将日志写入流资源的PSR日志记录器。

这特别适用于写入STDERR或STDOUT,或写入文件。

方法:StreamResourceLogger->__construct

function __construct($resource)
参数
  • 资源 $resource - 可写流资源

抛出: \Corpus\Loggers\Exceptions\LoggerArgumentException - 如果给定的资源不是流

抛出: \Corpus\Loggers\Exceptions\LoggerInitException - 如果给定的资源不可写