FrankenPHP安装后默认不写日志文件,所有关键日志(启动信息、HTTP请求、PHP错误、panic)均输出到stdout/stderr;查看方式取决于运行环境:终端直接运行时看终端输出,Docker用docker logs -f,systemd用journalctl -u frankenphp -f。

FrankenPHP 安装后默认不自动写入日志文件,所有关键日志(启动信息、HTTP 请求、PHP 错误、panic)都输出到 stdout 或 stderr,也就是你运行命令的终端界面。能不能看到、存到哪、怎么查,取决于你的运行方式。
查看终端直接输出的日志(最简单,适合调试)
你执行 frankenphp run 或 frankenphp server 后,只要没加 --quiet,启动成功提示、PHP 解析错误(如 Parse error)、端口冲突(如 bind: permission denied)、扩展加载失败等,都会立刻打印在当前终端上。
- 如果命令执行完就退出了 → 看最后一两行,90% 的问题线索就在这里
- 如果服务持续运行 → 所有 HTTP 请求(404/500)、PHP
error_log()、未捕获异常都会实时刷屏
✅ 小技巧:别关终端,这是第一手现场证据;容器或 systemd 下也一样,只是 stdout/stderr 被转发给了别的地方。
Docker 环境下用 docker logs
FrankenPHP 官方镜像默认把全部日志(PHP 错误 + HTTP 访问摘要)输出到标准流,不写 /var/log/ 下任何文件。
立即学习“PHP免费学习笔记(深入)”;
# 查看最近日志并持续跟踪 docker logs -f frankenphp-app # 只看最近 100 行再追加 docker logs -f --tail 100 frankenphp-app
⚠️ 注意:不要进容器里 cat /var/log/php_errors.log —— 那个文件很可能根本不存在或为空,除非你手动挂载并配置了 error_log。
systemd 服务下用 journalctl
只有当你用 systemctl start frankenphp 启动,并且 .service 文件里没禁用标准输出,日志才会进入 journald。
# 实时查看 sudo journalctl -u frankenphp -f # 查看今天的所有日志 sudo journalctl -u frankenphp --since today # 查看最近 50 行(适合启动闪退时快速定位) sudo journalctl -u frankenphp -n 50
检查服务是否配置正确:
- 运行
systemctl cat frankenphp,确认Type=simple,且没有StandardOutput=null - 修改过
.service文件后,必须执行sudo systemctl daemon-reload
启用结构化访问日志(HTTP 请求记录)
默认 不记录访问日志(即没有类似 Apache 的 access.log)。要开启,必须显式配置:
- 在
Caddyfile中加全局{ log }块(只对 Caddy 模式有效):{ log } localhost { route { php { root ./public } } } - 或在
frankenphp.yaml的servers下配置log_access(推荐):servers: - host: :8080 document_root: ./public log_access: /var/log/frankenphp/access.log⚠️
log_access必须是绝对路径,且 FrankenPHP 进程用户(如www-data)要有写权限。
PHP 错误日志单独看
Caddy 或 FrankenPHP 的日志不包含 PHP 运行时错误(Warning、Fatal error 等),它们走的是 PHP 自身机制:
- 确认
log_errors = On和error_log = stderr(或具体路径)在同一份生效的php.ini里 - 查真实加载的配置:
frankenphp php-cli -i | grep -E "(Loaded|error_log|log_errors)" - 若设为
error_log = stderr,它就和上面所有日志混在一起输出;若设为文件路径,确保目录可写、权限正确
不复杂但容易忽略。



















