webman默认日志不按天切割,因rotatingfilehandler默认按文件大小轮转而非日期;需手动配置带{date}的filenameformat、设maxfilesize=0,并通过定时器检测日期变化后重建handler。

Webman 默认日志不自动按天切割,必须手动配置 RotatingFileHandler 并启用日期滚动逻辑,否则 webman.log 会无限增长、单文件超 GB、排查困难。
为什么默认 RotatingFileHandler 不按天切分?
RotatingFileHandler 默认按「文件大小」和「保留数量」轮转,不是按日期。它只在当前日志文件达到设定大小(如 10MB)时才重命名并新建,跟日期无关。即使你设了 7 天保留,也不会每天生成一个新文件——可能三天写满一个,再两天写满另一个,时间戳混乱,无法快速定位某天日志。
常见误操作是以为构造参数里传了 7 就代表“保留 7 天”,其实那是「最多保留 7 个历史文件」,和日期无绑定关系。
如何强制按天生成新日志文件?
用 RotatingFileHandler 配合自定义文件名 + 定时器重开 handler,是最轻量、最可控的方案。Webman 常驻内存,不能依赖进程重启,必须主动干预:
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
- 在
config/log.php中,把RotatingFileHandler的日志路径改为带日期占位符的动态路径,例如:runtime_path().'/logs/webman_'.date('Y-m-d').'.log' - 在
app/bootstrap.php或自定义服务提供者中,注册一个每分钟执行的定时器,检查当前日期是否变化;若变化,调用$logger->popHandler()移除旧 handler,并 new 一个指向新日期文件的RotatingFileHandler - 注意:不要在每次写日志时都 new handler,只在日期切换时重建,避免频繁打开/关闭文件句柄
别踩 StreamHandler + php://stdout 的坑
开发环境用 StreamHandler 输出到终端很直观,但上线后若仍用 php://stdout,日志会混入 Webman 的主进程输出流,被 systemd 或 supervisor 截断、丢失,且无法按天归档。更严重的是:php://stdout 不支持文件锁,在多 worker 场景下会出现日志行错乱、内容覆盖。
生产环境必须改用文件 handler,哪怕只是临时替代方案:
- 禁用
StreamHandler,只保留RotatingFileHandler或自定义日期文件 handler - 确保
runtime_path().'/logs'目录存在,且 Webman worker 进程用户(如 www-data)有写权限 - 若用 Docker,需挂载该目录并设置 UID/GID 一致,否则出现
Permission denied却无报错
进阶:配合系统级工具做归档与清理
Webman 自身不处理日志压缩和过期删除,这部分必须交由外部机制。推荐组合:
- 每日零点用
find清理 30 天前的日志:find runtime/logs -name "webman_*.log" -mtime +30 -delete - 用
logrotate做压缩备份(适合已部署成熟运维体系的环境),注意配置copytruncate,避免中断 Webman 写入 - 绝对不要在 Webman 里用
file_put_contents(..., FILE_APPEND)手动拼接日志——绕过 Monolog 会导致格式错乱、级别丢失、无上下文处理器(如ProcessIdProcessor)
真正的难点不在“怎么切”,而在“切完之后谁负责删、谁负责压、谁保证不丢”。Webman 日志管道一旦打通,后续归档链路必须闭环,否则几个月后你会面对一堆 webman_2026-03-*.log 占满磁盘却不敢动。










