php 8.3 中配置 monolog 3.x 日志通道需创建 logger 实例、绑定 rotatingfilehandler 等处理器并添加 uidprocessor;支持多通道隔离、fingerscrossedhandler 触发式记录;集成时应遵循 psr-3,通过 di 容器注册 loggerinterface 实例。

在 PHP 8.3 中配置 Monolog 日志通道,核心是创建 Logger 实例并绑定一个或多个 Handler,再通过 Processor 增强日志上下文。Monolog 3.x(兼容 PHP 8.1+)是当前推荐版本,需注意其与旧版 API 的差异。
安装 Monolog 3.x
使用 Composer 安装最新稳定版(截至 2024 年支持 PHP 8.3):
composer require monolog/monolog:^3.0
确保项目已启用 ext-json 和 ext-mbstring(Monolog 3 默认依赖)。
配置基础文件日志通道
以下示例创建名为 app 的通道,将日志写入 var/log/app.log,按级别滚动:
- 使用
RotatingFileHandler自动按天切分、保留 7 天日志 - 设置最低记录级别为
INFO,DEBUG级别不写入文件 - 添加
UidProcessor注入请求唯一 ID,便于追踪
use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;
use Monolog\Processor\UidProcessor;
$logger = new Logger('app');
$handler = new RotatingFileHandler('var/log/app.log', 7, Logger::INFO);
$handler->setFilenameFormat('{filename}-{date}', 'Y-m-d');
$logger->pushHandler($handler);
$logger->pushProcessor(new UidProcessor());
配置多通道与条件路由
可为不同用途定义独立通道(如 API 错误、审计日志),并用 WhatFailureGroupHandler 或自定义逻辑分流:
- 创建
audit通道,仅记录NOTICE及以上,并写入单独文件 - 用
FingersCrossedHandler实现“错误触发式”日志:仅当发生WARNING时才把本次请求的全部日志(含之前的 DEBUG/INFO)刷入文件 - 避免在生产环境启用
StreamHandler('php://stdout'),调试阶段除外
use Monolog\Handler\FingersCrossedHandler;
use Monolog\Handler\StreamHandler;
use Monolog\Logger;
// 审计通道(仅 NOTICE+)
$auditLogger = new Logger('audit');
$auditLogger->pushHandler(new RotatingFileHandler('var/log/audit.log', 30, Logger::NOTICE));
// 故障快照通道(WARN+ 触发回溯)
$snapshotHandler = new FingersCrossedHandler(
new RotatingFileHandler('var/log/errors.log', 14),
Logger::WARNING
);
$snapshotHandler->setAcceptableLevels([Logger::WARNING, Logger::ERROR, Logger::CRITICAL]);
$mainLogger = new Logger('main');
$mainLogger->pushHandler($snapshotHandler);
集成到 PSR-3 兼容框架(如 Laravel/Slim)
若项目使用容器或框架,应返回 PSR-3 LoggerInterface 实例:
- 在依赖注入容器中注册工厂方法,避免全局静态实例
- 利用
Logger::withName()衍生子通道(如$logger->withName('db')),保持命名空间隔离 - 禁用
Logger::useMicrotime(true)(Monolog 3 已默认启用高精度时间)
// 示例:DI 容器中声明服务(伪代码)
$container->set(LoggerInterface::class, function () {
$logger = new Logger('app');
$logger->pushHandler(new RotatingFileHandler(__DIR__.'/../var/log/app.log'));
return $logger;
});
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











