monolog日志需通过通道、处理器、级别和格式器四层控制实现清晰、分离与安全;选用streamhandler、rotatingfilehandler等适配场景;分通道隔离模块日志;设合理级别并用lineformatter或jsonformatter规范输出;生产环境须检查权限、脱敏、限频、轮转及容器日志输出。

用 Monolog 记录系统日志,关键不是“能不能写”,而是“写得清楚、分得明白、留得安全”。它不是简单地把错误塞进一个文件,而是通过通道(channel)、处理器(handler)、级别(level)和格式化器(formatter)四层控制,让日志真正可查、可控、可运维。
选对处理器,决定日志去哪
处理器是日志落地的执行者。不同场景用不同处理器:
-
StreamHandler:最基础,直接写入指定文件(如
app.log),适合开发或轻量部署; - RotatingFileHandler:按天或按大小自动轮转,保留最近 N 天/个文件,防止磁盘打满(生产环境必备);
- SocketHandler:发往远程日志服务(如自建 syslog 或 ELK 的 Logstash),适用于多服务器统一收集;
-
NativeMailerHandler:对
CRITICAL或EMERGENCY级别自动发邮件告警; - SyslogHandler:对接系统级 syslog,便于与 OS 日志体系整合。
分通道记录,避免日志混杂
一个系统有支付、用户、API、定时任务等不同模块,混在同一个日志里排查效率极低。Monolog 支持多通道隔离:
- 定义独立通道名,如
payment、api; - 为每个通道配置专属处理器和日志路径(如
payment.log); - 在代码中调用
Log::channel('payment')->info('Order #123 succeeded')(Laravel)或$this->get('monolog.logger.payment')(Symfony),日志自动分流。
设好级别和格式,兼顾可读与解析
日志不是越多越好,要靠级别过滤 + 格式统一:
- 默认最低记录
INFO,调试时可临时调至DEBUG,生产环境建议从WARNING起; - 用
LineFormatter输出易读文本(含时间、通道、级别、消息、上下文); - 用
JsonFormatter输出结构化 JSON,方便日志平台(如 Grafana Loki、ELK)自动提取字段; - 在记录时传入上下文数组,比如
['user_id' => 1001, 'ip' => $request->ip()],比拼接字符串更安全、更易检索。
生产环境必须注意的几件事
上线前这几项不检查,日志可能白记:
- 确保日志目录存在且 Web 进程有写权限(常见问题:
Permission denied); - 敏感信息如密码、token、银行卡号、密钥,禁止写入日志(可借助
Processor自动脱敏); - 避免在循环中高频打日志(如每秒数百次
info()),可用BufferHandler缓冲后批量写入; - 设置
max_files和filename_format,防止日志无限增长; - 若用容器部署,日志应输出到 stdout/stderr,由容器平台统一采集,而非写宿主机文件。











