Caddy默认不输出日志,必须在Caddyfile顶部添加全局{ log }块;若需落盘,须显式配置output file /path/to/log并确保目录存在且进程有写权限。

日志不输出?先确认 { log } 全局块是否存在
FrankenPHP 默认完全静默——frankenphp run 启动后,连 200 请求都不会打印到终端。这不是 bug,是 Caddy 的设计:没有显式 { log } 块,就没有访问日志。你看到的只有 PHP 解析错误或 panic,普通请求、404、500 全被丢弃。
必须在 Caddyfile 顶部(任何 site 块之前)加一行:
{ log }
注意:{ log } 是全局指令,不能嵌套在 localhost { ... } 里;放错位置等于没写。
想写入文件而不是终端?用 output file /path/to/access.log
默认 { log } 只把日志发到 stderr(也就是你启动时的终端),关掉终端就丢失。要落盘,必须指定 output:
立即学习“PHP免费学习笔记(深入)”;
-
output file /var/log/frankenphp/access.log—— 写入文件,但需确保目录存在且 FrankenPHP 进程有写权限 -
output stdout—— 适合容器环境,配合docker logs -f查看 -
output stderr—— 和默认行为一致,只是显式声明
完整示例:
{ log
output file /var/log/frankenphp/access.log
}
localhost {
route {
php {
root /app/public
}
}
}
PHP 错误日志和 Caddy 日志是两套系统
Caddy 的 { log } 只管 HTTP 层(状态码、路径、耗时),PHP 运行时错误(Warning、Fatal error)走的是 PHP 自己的错误机制,和 Caddy 日志无关。
要让 PHP 错误也落地,得改 php.ini 或运行时设置:
- 确认
log_errors = On - 设
error_log = /var/log/frankenphp/php_error.log(路径需与 Caddy 日志目录统一) - 若用
error_log($msg, 4)手动打日志,它默认写到error_log配置的路径,不是 Caddy 日志文件
别指望只配一个 { log } 就能同时看到 “GET /api/user 200” 和 “PHP Parse error”,这是两个独立通道。
Docker 或 systemd 下日志容易“看不见”
在容器或守护进程里,output file 路径若指向容器内临时路径(如 /tmp/access.log),容器重启后日志就丢了;若用 output stdout 却没配好 docker logs 或 journalctl,也会以为“没日志”。
推荐做法:
- Docker:用
-e CADDY_LOG_OUTPUT=stdout+output stdout,再挂载宿主机目录存档 - systemd:确保
StandardOutput=journal和StandardError=journal,然后用journalctl -u frankenphp -f - 生产环境务必配
logrotate,FrankenPHP 自身不轮转日志
最常被忽略的一点:日志路径权限。FrankenPHP 进程用户(如 www-data)必须对日志目录有 w 权限,否则 touch /var/log/frankenphp/access.log 都会失败,且不报错——日志直接消失。



















