webman 默认日志不支持按模块或级别分类存储,需手动配置filterhandler+rotatingfilehandler实现分级;业务日志用多channel路由,如pay/order;并发写入须启用lock_ex防日志撕裂。

Webman 默认日志配置不支持按业务模块或错误级别分类存储,必须手动改写 config/log.php 中的 handlers 配置才能实现。
为什么不能直接用 RotatingFileHandler 按级别分文件?
Monolog 的 RotatingFileHandler 本身不带过滤能力——它只管滚动,不管内容。如果你只配一个 RotatingFileHandler 并设为 Logger::ERROR,它确实只写 ERROR,但 INFO/WARNING 就彻底丢失了,不是“分存”,是“丢弃”。
真正实现分级存储,得靠 FilterHandler 套一层:
-
FilterHandler负责拦截指定 level 的日志,再把它们转发给下游 handler(比如另一个RotatingFileHandler) - 每个级别(ERROR/INFO/DEBUG)需单独配一套
FilterHandler+RotatingFileHandler - 注意
accept_on_match参数:设为true表示“匹配就留下”,false表示“匹配就丢弃”
config/log.php 中 ERROR 日志单独存 error.log 的写法
在 handlers 数组里加一段,不要动默认的全量 handler:
['class' => FilterHandler::class,
'constructor' => [
['class' => RotatingFileHandler::class,
'constructor' => [runtime_path() . '/logs/error.log', 7, Logger::ERROR]],
Logger::ERROR,
true
],
'formatter' => [
'class' => Monolog\Formatter\LineFormatter::class,
'constructor' => ["%datetime% %level_name% %logger%:%L% - %message%\n", 'Y-m-d H:i:s', true]
]],
关键点:
-
RotatingFileHandler的第三个参数必须是Logger::ERROR,否则FilterHandler匹配不到 - 路径用
runtime_path() . '/logs/error.log',别写相对路径如./logs/error.log,Webman 启动时可能找不到 - formatter 单独配,避免和 console handler 共用导致颜色标记污染纯文本日志
业务模块日志分离:用 Logger 实例名做路由
Monolog 支持多 logger 实例,名字就是路由键。比如你希望支付模块日志进 pay.log,订单模块进 order.log,不依赖全局 handler 过滤:
- 在代码里用
Log::channel('pay')或container()->get(Logger::class)->withName('pay') - 在
config/log.php的channels里新增'pay'配置项,class 指向RotatingFileHandler,文件路径写死为pay.log - 注意:Webman 的
Logfacade 默认只代理defaultchannel,要支持多 channel 得确保config/log.php里定义了对应 key,并且没被Log::setInstance()锁死
这种方式比在 handler 里用 Processor 解析 $record['context'] 更轻量、更可控。
容易忽略的并发写入风险
多个 worker 进程同时写同一个日志文件(哪怕只是 error.log),不用 LOCK_EX 会丢行或错乱。但 RotatingFileHandler 默认不加锁——它依赖操作系统追加写(append)的原子性,而 Linux 下单次 write() 小于 4KB 才保证原子,超长日志仍可能撕裂。
稳妥做法:
- 所有
RotatingFileHandler的constructor第四个参数显式传true(即启用file_put_contents(..., FILE_APPEND | LOCK_EX)) - 别为了性能关掉锁;日志写入本就不该是瓶颈,撕裂的日志才是真瓶颈
- 如果用了 Swoole 协程,确认 handler 没有跨协程复用资源(
RotatingFileHandler是线程安全的,但非协程安全——不过 Webman 当前稳定版未开启协程日志写入,暂可不处理)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











