firehed / simplelogger
与PSR-3兼容的日志记录器。支持写入文件、STDOUT、STDERR和syslog。还提供可写入多个目标的链式日志记录器。允许自定义和可插拔的格式,包括logfmt。
Requires
- php: ^8.1
- psr/log: ^2.0 || ^3.0
Requires (Dev)
- firehed/clock: ^1.0
- phpstan/phpstan: ^1.12
- phpstan/phpstan-phpunit: ^1.4
- phpunit/phpunit: ^10 || ^11
- psr/clock: ^1.0
- squizlabs/php_codesniffer: ^3.10
Provides
- psr/log-implementation: 1.0.0
Conflicts
- phpunit/phpunit: >=8.5 <=8.5.20
This package is auto-updated.
Last update: 2024-09-17 00:01:59 UTC
README
SimpleLogger是一个PHP日志库。它具有简单直观的默认设置,并提供了额外的自定义钩子。
- 驱动程序:Syslog、stdout、stderr和文本文件
- 兼容PSR-3标准日志接口
- 要求:PHP >= 8.1
- 许可:MIT
用法
安装
composer require firehed/simplelogger
Syslog
将日志消息发送到Syslog
<?php require 'vendor/autoload.php'; // Setup Syslog logging $logger = new Firehed\SimpleLogger\Syslog('myapp'); // Output to syslog: "Jun 2 15:55:09 hostname myapp[2712]: foobar" $logger->error('foobar'); // Output to syslog: "Jun 2 15:55:09 hostname myapp[2712]: Error at /Users/Me/Devel/libraries/simpleLogger/example.php at line 15" $logger->error('Error at {filename} at line {line}', ['filename' => __FILE__, 'line' => __LINE__]);
文件
将日志消息发送到文本文件
<?php require 'vendor/autoload.php'; // Setup File logging $logger = new Firehed\SimpleLogger\File('/tmp/simplelogger.log'); // Output to the file: "[2013-06-02 16:03:28] [info] foobar" $logger->info('foobar'); // Output to the file: "[2013-06-02 16:03:28] [error] Error at /Users/fred/Devel/libraries/simpleLogger/example.php at line 24" $logger->error('Error at {filename} at line {line}', ['filename' => __FILE__, 'line' => __LINE__]);
Stdout和Stderr
$logger = new \Firehed\SimpleLogger\Stdout(); // or $logger = new \Firehed\SimpleLogger\Stderr();
这些日志记录器将写入STDOUT或STDERR;即 php://stdout
或 php://stderr
。Stdout在Docker和/或Kubernetes中非常常用。
日志记录器的最小日志级别
在此示例中,只有级别 >= "error" 的消息才会发送到Syslog处理器,但所有内容都会发送到文件处理器
<?php require 'vendor/autoload.php'; $syslog = new Firehed\SimpleLogger\Syslog('myapp'); $syslog->setLevel(Psr\Log\LogLevel::ERROR); // Define the minimum log level $file = new Firehed\SimpleLogger\File('/tmp/simplelogger.log'); $logger = new Firehed\SimpleLogger\ChainLogger([$syslog, $file]); $logger->debug('debug info sent only to the text file'); $logger->error('my error message'); $logger->error('my error message with a {variable}', ['variable' => 'test']);
默认的最小日志级别为 LogLevel::DEBUG
。
格式化
从3.0.0版本开始,可以通过多种方式自定义消息格式
- 初始化
DefaultFormatter
,使用setFormat(string $format)
更改其格式,并将其传递给日志记录器的构造函数 - 使用不同的捆绑格式化程序,例如
LogFmtFormatter
- 创建一个实现
FormatterInterface
的类,并将其传递给日志记录器的构造函数
默认格式化程序
提供的格式必须包含 %s
,这是实际插值消息将被放置的位置。格式可以包括 {date}
和/或 {level}
,它们分别是时间戳和日志级别的占位符。
默认格式为 [{date}] [{level}] %s
,这将导致类似这样的日志消息
[2018-06-28T13:32:12+00:00] [debug] query finished in 0.0021688938140869s
日期默认为ATOM格式,但也可以通过使用 setDateFormat(string $format)
来自定义,使用任何 date()
接受的格式字符串。
默认情况下,这将忽略 exception
键并执行正常的消息插值。通过调用 setRenderExceptions(true)
,如果设置了该键,则将相当于 (string) $context['exception']
添加到日志消息中,只要该值是 Throwable
。
LogFmt
LogFmtFormatter
将以 logfmt
格式写入日志。默认情况下,将设置 msg
、level
和 ts
键,并且 context
中的任何未插值的值都将作为额外的键/值对添加。异常也将根据 OTel约定 渲染。
任何解析为空字符串或无法转换为字符串的值(数组、没有 __toString()
的对象)将被删除。
提示
来自上下文的任何插值值 都不会 放入键/值对中。为了最大限度地利用结构化日志格式,如logfmt,请限制代码消息中的插值键。
例如,首选这个
$logger->debug('Request complete', ['duration_ms' => $ms]); // produces `msg="Request complete" duration_ms=42`
而不是这个
$logger->debug('Request complete in {duration} ms', ['duration' => $ms]); // produces `msg="Request complete in 42 ms"`
自定义 FormatterInterface
如果您需要更深入的自定义,例如日志丰富或更大的格式转换,那么使用自定义的FormatterInterface
是最佳选择。这样做需要您编写自己的插值逻辑,以及任何其他消息丰富或格式化。您将获得与LoggerInterface::log()
相同的(未修改的)参数,并负责将这些值转换为字符串。
发送到多个日志记录器
使用ChainLogger
向多个PSR-3日志记录器发送日志消息
<?php require 'vendor/autoload.php'; use Firehed\SimpleLogger as SL; $logger = new SL\ChainLogger([new SL\StdErr()]); $logger->addLogger(new SL\Syslog('myapp')); $logger->addLogger(new SL\File('/tmp/simplelogger.log')); $logger->info('my message'); $logger->error('my error message'); $logger->error('my error message with a {variable}', ['variable' => 'test']);
ChainLogger
除了支持它转发的日志记录器之外,还支持日志级别。这个配置只能通过构造函数参数进行。如果一个日志条目的严重性低于配置的级别,链中的任何日志记录器都不会接收到消息。这些日志记录器可以选择进行额外的过滤。