Phalcon 的 Phalcon\Logger 支持多适配器分流,可将业务日志(INFO+)写入 business.log、错误日志(ERROR+)写入 error.log;主 logger 需设为 DEBUG 级别,由各 handler 自行过滤,避免仅靠主 level 拦截导致日志丢失。

Phalcon 的 Phalcon\Logger 支持多适配器(Multiple Handlers),可让业务日志和错误日志分别写入不同文件,避免混杂、便于排查与归档。
用 MultipleStream 实现双文件分流
Phalcon 提供 Phalcon\Logger\Multiple 类,允许同时挂载多个适配器。关键点是:每个适配器可独立设置日志级别和目标路径,不依赖 logger 自身 level 过滤——这和 Python logging 的 handler 分流逻辑一致。
- 创建一个
MultipleStream实例作为主 logger - 为业务日志添加
FileAdapter('logs/business.log'),并设其 handler 级别为INFO - 为错误日志添加另一个
FileAdapter('logs/error.log'),设其级别为ERROR或ALERT - 注意:主 logger 的 level 应设为
DEBUG,确保所有日志都能进入各 handler,由 handler 自行过滤
代码示例:业务/错误日志分离写入
以下代码将 INFO 及以上日志写入 business.log,ERROR 及以上仅写入 error.log:
use Phalcon\Logger;
use Phalcon\Logger\Multiple as MultipleStream;
use Phalcon\Logger\Adapter\File as FileAdapter;
$logger = new MultipleStream();
// 业务日志:INFO 级别起,写入 business.log
$businessHandler = new FileAdapter('logs/business.log');
$businessHandler->setLogLevel(Logger::INFO);
$logger->push($businessHandler);
// 错误日志:ERROR 级别起,写入 error.log
$errorHandler = new FileAdapter('logs/error.log');
$errorHandler->setLogLevel(Logger::ERROR);
$logger->push($errorHandler);
// 使用方式(自动按级别分流)
$logger->info('订单创建成功', ['order_id' => 1001]); // → business.log
$logger->error('数据库连接失败', ['host' => 'db01']); // → business.log + error.log
$logger->debug('缓存 key: user_123'); // → 不写入任一文件(因两个 handler 的 level 都高于 DEBUG)
避免常见陷阱
实际部署中容易踩坑,需特别注意:
-
不要只靠 logger->setLogLevel():若主 logger 设为
INFO,ERROR日志能过,但DEBUG和WARNING就直接被拦在门外,无法交给 handler 判断 -
文件路径需有写权限:确保
logs/目录存在且 Web 进程用户(如 www-data)可写,否则静默失败 - 不支持自动轮转:Phalcon 原生 FileAdapter 不带日志切割功能,长期运行需配合外部脚本或 cron 定期清理旧文件(如保留 7 天)
-
事务模式慎用于多 handler 场景:
begin()/commit()是针对单个适配器的,对MultipleStream无效;如需原子性,应自行封装或改用队列异步落盘
进阶建议:加结构化字段与上下文
单纯分文件还不够,建议在日志内容中注入统一上下文,提升可查性:
- 记录请求 ID(如
request_id),便于串联一次完整调用链 - 使用
extra参数传入业务标识(如['service' => 'order', 'user_id' => 889]) - 若需 JSON 格式输出,可继承
FileAdapter并重写logInternal()方法,或前置用json_encode()拼装消息体

















