FrankenPHP默认不输出访问日志,需在Caddyfile中显式配置{ log }全局块,日志默认输出到stderr(终端),PHP错误日志则由php.ini中error_log和log_errors控制。

frankenphp run 启动后默认不输出访问日志
直接运行 frankenphp run 时,它不会把 HTTP 请求记录打印到终端,也不会自动生成 access.log 文件——这和 Nginx 或 Apache 的默认行为不同。你看到的只有启动成功提示、PHP 错误(如 parse error)或 panic 级崩溃,普通 404、500、请求耗时等全被静默丢弃。
启用 Caddy 标准日志需在 Caddyfile 中显式配置
FrankenPHP 基于 Caddy,所有日志能力都来自 Caddy 的 log 指令。不写配置,就没有结构化日志。最小可用配置如下:
{ log } localhost { route { php { root /path/to/your/app } } }
关键点:
-
{ log }是全局块,必须存在,否则整个服务无日志输出 - 日志默认输出到 stderr(即你启动时的终端),不会写入文件;要存文件得加
output file /var/log/frankenphp/access.log - 若用 Docker 运行,stdout/stderr 会被容器引擎捕获,可直接用
docker logs -f <container>查看
查看 PHP 错误日志不能只靠 Caddy 日志
Caddy 日志只记录 HTTP 层信息(状态码、路径、耗时等),PHP 运行时错误(Warning、Notice、Fatal error)仍走 PHP 自身错误机制。你需要确认两件事:
立即学习“PHP免费学习笔记(深入)”;
- PHP 的
error_log配置指向哪里:默认可能是stderr(终端可见),也可能是/var/log/php_errors.log(需手动查路径) - 检查
php.ini中的log_errors = On和error_log = /path/to/error.log是否生效 - FrankenPHP 二进制启动时若没加载自定义 php.ini,会 fallback 到内置默认值,建议用
frankenphp php-cli -i | grep error_log确认实际路径
调试启动失败时看 stderr + exit code 最直接
服务根本起不来?别急着翻日志文件。90% 的情况是:
-
frankenphp run执行后立刻退出 → 检查终端最后一行错误,比如listen tcp :80: bind: permission denied(端口被占或没权限) - 报
failed to load PHP extension "xxx"→ 对应扩展未编译进 FrankenPHP 或路径不对,FrankenPHP 不支持动态加载所有传统 .so 扩展 - 出现
panic: runtime error→ 多半是 Caddyfile 语法错误或 PHP 脚本在 Provision 阶段就 crash,此时唯一线索就是终端 stderr 输出
日志文件永远滞后,而 stderr 是第一手现场证据——尤其在容器或 systemd 环境下,记得先用 journalctl -u frankenphp -n 50 -f 或 docker logs --since 5m 抓实时输出。



















