firehed/simplelogger

与PSR-3兼容的日志记录器。支持写入文件、STDOUT、STDERR和syslog。还提供可写入多个目标的链式日志记录器。允许自定义和可插拔的格式,包括logfmt。

3.0.0 2024-09-16 23:35 UTC

README

Test Lint Static analysis codecov

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://stdoutphp://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 格式写入日志。默认情况下,将设置 msglevelts 键,并且 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除了支持它转发的日志记录器之外,还支持日志级别。这个配置只能通过构造函数参数进行。如果一个日志条目的严重性低于配置的级别,链中的任何日志记录器都不会接收到消息。这些日志记录器可以选择进行额外的过滤。