frankenphp 日志需用 logrotate 按大小切割,核心配置为 size 50m + copytruncate;caddy 无内置轮转能力,单文件追加写入易丢日志,必须依赖系统级 logrotate 管理。

FrankenPHP 本身不支持按大小切分日志
FrankenPHP 没有内置日志轮转功能,它的日志由底层 Caddy 引擎输出,而 Caddy 默认采用单文件追加写入(如 access.log 一直增长)。Caddy v2.8+ 虽支持 log 指令里的 roll 100MB,但该机制仅做简单重命名,不压缩、不归档、不清理旧文件,更关键的是:没有 copytruncate 或句柄刷新能力——高并发下易丢日志或触发 EBUSY 错误。
必须用 logrotate 配置 size 触发切割
正确做法是交由系统级 logrotate 管理,通过 size 参数实现按大小切分。例如限制单个日志文件不超过 50MB:
/var/log/frankenphp/*.log {
size 50M
missingok
rotate 7
compress
delaycompress
notifempty
create 644 www-data www-data
copytruncate
sharedscripts
postrotate
# 可选:若需通知服务(FrankenPHP 不响应 USR1,通常留空)
endscript
}
-
size 50M是核心:当日志文件 ≥ 50MB 时触发轮转,比daily更适合流量不均的业务 -
copytruncate必须保留:先复制内容再清空原文件,确保 Caddy 持续写入同一 inode,不中断、不报错 -
create 644 www-data www-data要匹配你的运行用户(Ubuntu/Debian 是www-data,CentOS 是apache) -
rotate 7表示最多保留 7 个归档(.log.1~.log.7),超出自动删除最老的
验证 size 切割是否真正生效
配置完别只看文件名变化,要确认三件事:
- 手动触发并检查文件状态:
sudo logrotate -f /etc/logrotate.d/frankenphp && ls -l /var/log/frankenphp/,应看到access.log大小归零,access.log.1有内容且属主正确 - 实时观察写入:
sudo tail -f /var/log/frankenphp/access.log,发几个请求,确认新日志行立即出现(说明没因权限/截断失败而静默丢弃) - 模拟大日志触发:
dd if=/dev/zero of=/var/log/frankenphp/access.log bs=1M count=55,再跑一次logrotate -f,验证是否按 50MB 切出.log.1
最容易被忽略的是路径一致性:Caddyfile 中 log 指令写的路径(如 /var/log/frankenphp/access.log),必须和 logrotate 配置里监控的路径完全一致,否则轮转永远不会触发。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











