日志文件空着是因为路径、权限、配置或捕获方式未对齐:frankenphp不创建文件,仅以运行用户追加写入;需确认frankenphp.yaml中logs.output为绝对路径且配置生效,运行用户对路径有完整权限,并排除systemd/docker重定向stdout干扰。

日志文件存在但空着,多半是权限或路径没对上
FrankenPHP 不会主动创建日志文件,它只尝试以运行用户身份(如 www-data)打开并追加写入。文件存在 ≠ 可写:若父目录不可进入(缺 x 权限)、属主不匹配、或路径在 frankenphp.yaml 里写错,就会静默失败——文件空着,连错误提示都不打。
- 用
sudo -u www-data touch /var/log/frankenphp/access.log测试是否真能写;失败就说明权限/属主/路径三者至少一个不对 - 检查
frankenphp.yaml中logs.output的路径是否和你看到的文件路径完全一致(注意软链接、大小写、尾部斜杠) - 运行
ps aux | grep frankenphp确认实际运行用户,再查该用户对目录的权限:getfacl /var/log/frankenphp
frankenphp.yaml 的 logs 配置没生效
FrankenPHP 自身日志(不是 PHP 应用的 error_log())只认 frankenphp.yaml 里的 logs 块。如果配置文件名拼错、路径不在默认查找顺序中、或启动时没加 --config,它就退回到默认行为:只输出到 stderr,不写文件。
- 启动时加
--verbose或不加--quiet,看终端是否打印INFO Using config file: ...—— 没这行,说明配置根本没加载 - 默认查找路径是:
./frankenphp.yaml→./config/frankenphp.yaml→/etc/frankenphp/frankenphp.yaml;别放错位置 -
logs.output必须是绝对路径;写成logs/access.log这种相对路径会被忽略
你以为的日志文件,其实不是 FrankenPHP 写的
很多人把 /var/log/php/error.log 或 Caddy 原生 /var/log/caddy/access.log 当成 FrankenPHP 日志,但它们由不同机制控制:前者靠 php.ini 的 error_log,后者需在 Caddyfile 里显式配 { log } 块。FrankenPHP 自身的 logs.output 是另一套。
- 确认你在查哪个文件:用
lsof -i :8000找到 FrankenPHP 进程 PID,再查它打开了哪些日志文件:lsof -p <pid> | grep log</pid> - Caddy 访问日志要启用,必须在 Caddyfile 顶层写
{ log },且log块里得有output file /path/to/access.log - PHP 错误日志是否写入文件,取决于
php.ini中log_errors = On和error_log = /path/to/php-error.log是否生效,跟frankenphp.yaml无关
systemd 或 Docker 拦截了 stdout/stderr,导致文件日志被绕过
如果你用 systemd 启动却在 frankenphp.yaml 里配了 logs.output,而同时又在 service 文件里写了 StandardOutput=append:/var/log/frankenphp.log,那 FrankenPHP 就不会自己写文件——它老老实实往 stdout 输出,systemd 接过去存了。
- 查 systemd service 文件里有没有
StandardOutput/StandardError重定向;有,就说明日志走的是 systemd journal 或指定文件,不是frankenphp.yaml控制的 - Docker 场景下,
docker logs查到的是容器 stdout/stderr 缓存,不是磁盘上的access.log;若挂载了/var/log/frankenphp却没内容,先确认容器内进程是否真在往那个路径写(ls -l /proc/<pid>/fd/ | grep log</pid>) - FrankenPHP 容器镜像默认以 UID 1001 运行,宿主机挂载目录必须允许该 UID 写入,不能只改
www-data权限
lsof 看进程到底打开了哪个文件描述符,最后验证该描述符对应路径的权限是否真能让运行用户写进去。别假设文件存在就等于可用。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











