FrankenPHP自身日志配置仅影响其启动、路由、worker崩溃等行为,与PHP的error_log完全无关;需确认frankenphp.yaml被正确加载、路径权限完整、且修改后必须重启进程。

确认改的是 FrankenPHP 自身日志,不是 PHP 错误日志
FrankenPHP 的日志配置和 PHP 应用的 error_log 完全无关。你改了 frankenphp.yaml 里的 logs.output,只影响 FrankenPHP 启动、路由、worker 崩溃等自身行为的日志;而 PHP 脚本里的 trigger_error()、error_log() 或 Fatal Error,仍走 php.ini 中的 error_log 和 log_errors。两者路径、权限、生效时机都不同,混在一起查只会绕晕。
检查 frankenphp.yaml 是否被实际加载
FrankenPHP 不会自动扫描或热重载配置文件。没指定 --config 参数时,它只按固定顺序查找:./frankenphp.yaml → ./config/frankenphp.yaml → /etc/frankenphp/frankenphp.yaml。如果文件名写成 frankenphp.yml 或放在 config/ 外的其他子目录,就等于没配。
- 启动时加
--debug或不加--quiet,观察终端输出是否有类似INFO Using config file: /path/to/frankenphp.yaml - 若没这行,说明配置文件根本没被读到,此时
logs块完全无效,日志默认输出到stdout - Docker 用户注意:挂载路径是否覆盖了容器内预期位置?比如
-v $(pwd)/conf:/etc/frankenphp,但镜像里实际找的是/etc/frankenphp/frankenphp.yaml,少一层目录就失效
验证 logs.output 路径权限和父目录可写性
FrankenPHP 进程(通常是 www-data 或容器内 UID 为 33 的用户)必须对 logs.output 指定的**整个路径链**有写权限,包括每一级父目录的 x(执行/进入)权限。
- 例如设
output: /var/log/frankenphp/server.log,需确保:/var/log、/var/log/frankenphp都存在,且www-data对它们有r-x(进入),对server.log所在目录有w(写) - 常见错误:只
chown www-data:www-data /var/log/frankenphp/server.log,但忘了/var/log/frankenphp/目录本身属主不对或权限是750(组不可进) - 快速验证:
sudo -u www-data touch /var/log/frankenphp/test.log,失败则立刻暴露权限断点
区分 Caddy 访问日志和 FrankenPHP 运行日志
很多人以为改了 logs.output 就能看到 HTTP 请求记录,其实不会。FrankenPHP 的 logs 块只管自身运行状态;HTTP 访问日志由 Caddy 控制,必须在 Caddyfile 里显式写 { log } 全局块,并配置 output —— 这和 frankenphp.yaml 是两套独立系统。
立即学习“PHP免费学习笔记(深入)”;
- 要启用访问日志:Caddyfile 开头加
{ log { output /var/log/frankenphp/access.log } } - 这个
output路径同样要检查权限,且和frankenphp.yaml里的logs.output可以指向不同文件 - 若只改了
frankenphp.yaml却没动Caddyfile,那永远看不到GET / 200这类请求行
最常被忽略的是:FrankenPHP 日志配置修改后必须重启进程,没有热重载;而权限问题往往卡在父目录的 x 权限上,不是文件本身——这点和传统 Web 服务习惯相反。



















