frankenphp自身不生成容器日志,爆满的是docker管理的/json-file日志;需通过daemon.json全局配置或docker run时指定log-opt限制日志大小与数量,并用truncate清空而非rm。

FrankenPHP 本身不管理容器日志——它不是 Docker 容器,而是单进程二进制;所谓“FrankenPHP 容器日志”实际是误称。真正撑满磁盘的,是运行 FrankenPHP 的宿主机上,**Docker 容器的日志文件**(即 /var/lib/docker/containers/**/*-json.log),或你用 docker run 启动 FrankenPHP 时未配日志限制导致的膨胀。
要解决这个问题,得从 Docker 层下手,而不是改 FrankenPHP 配置。
为什么 docker logs 会爆满,而 FrankenPHP 自身日志不在此列
FrankenPHP 作为可执行文件,若直接在宿主机运行(非容器),它的标准输出/错误默认走 systemd journal 或终端,不落地为大文件;但一旦你把它打包进 Docker 镜像并用 docker run 启动,Docker 就会接管其 stdout/stderr,并按默认 json-file 驱动写入磁盘日志。这才是根源。
- 确认是否真在用 Docker 运行:执行
docker ps | grep franken,有输出才说明是容器化部署 -
FrankenPHP自身不生成*-json.log文件;这些全是 Docker 守护进程写的 - 即使
FrankenPHP开启了worker模式,只要它跑在容器里,日志仍由 Docker 控制
限制 FrankenPHP 容器日志的两种可靠方式
必须在容器启动前配置日志策略,Docker 不支持对运行中容器动态修改日志驱动参数。
- 方式一:全局配置(推荐,一劳永逸)
编辑/etc/docker/daemon.json,加入:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
然后重启守护进程:systemctl restart docker。此后所有新创建的容器(包括 FrankenPHP 容器)都会自动继承该策略。
- 方式二:单容器显式指定(适合临时调试或混部环境)
启动时加参数:
docker run -d \ --name frankenphp \ -p 8000:8000 \ --log-driver json-file \ --log-opt max-size=10m \ --log-opt max-file=3 \ frankenphp:latest
已经爆满?先清空再防复发
不要 rm 日志文件——Docker 进程仍持有句柄,空间不会释放。正确做法是 truncate:
- 查最大日志:
du -sh /var/lib/docker/containers/*/*-json.log | sort -hr | head -5 - 清空指定容器日志:
truncate -s 0 /var/lib/docker/containers/<container-id>/<container-id>-json.log</container-id></container-id> - 批量清空(谨慎):
find /var/lib/docker/containers/ -name '*-json.log' -exec truncate -s 0 {} \;
注意:清理后必须立刻补上日志限制配置,否则几小时又会复现。另外,FrankenPHP 若开启 worker 模式且大量打 debug 日志,建议同时在应用层控制日志级别(如关闭 debug 输出),避免日志源头过载。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











