PHP错误日志与Caddy访问日志是两套独立系统:前者由php.ini的log_errors和error_log控制,记录Warning、Fatal error等运行时错误;后者由Caddyfile中{ log }配置,仅记录HTTP层元信息如状态码、路径、耗时等。

PHP错误日志和Caddy访问日志是两套独立系统
Caddy日志只记录HTTP层事件(请求路径、状态码、耗时、客户端IP等),而Warning、Fatal error、Notice这类PHP运行时错误,走的是PHP自身的错误处理机制,根本不会经过Caddy的log指令管道。你看到Caddy日志里没有PHP错误,不是配置漏了,而是设计如此——它们压根就不在同一个通道里。
error_log()默认不输出到stdout/stderr
很多人以为error_log("msg")会直接出现在终端或容器docker logs里,但FrankenPHP默认把PHP错误日志写入文件(如/var/log/php/error.log),而不是标准流。这意味着:
-
error_log("test")→ 写进文件,不会出现在Caddy日志或docker logs -
error_log("test", 4)→ 显式写到stderr,这时才能被docker logs捕获 -
error_log("test", 3, "/tmp/app.log")→ 写进指定文件,需确保路径可写且logrotate已配好
php.ini里的log_errors必须为On
即使你调用了error_log(),如果PHP没开启日志记录开关,它就直接丢弃。检查生效的配置用:
frankenphp php-cli -i | grep -E "(log_errors|error_log|error_reporting)"
重点关注三项:
立即学习“PHP免费学习笔记(深入)”;
-
log_errors = On(生产环境必须开) -
error_log = /dev/stderr或/var/log/php/app.log(决定输出目标) -
error_reporting = E_ALL & ~E_DEPRECATED(控制哪些级别触发记录)
注意:FrankenPHP单文件分发版可能忽略系统级/etc/php/*/cli/php.ini,优先读取内置配置,改配置建议用-c参数指定路径或直接覆盖内置ini。
CADDY_LOG_OUTPUT=stdout不影响PHP错误日志
设置CADDY_LOG_OUTPUT=stdout只让Caddy的HTTP访问日志变成JSON并输出到stdout,对PHP错误日志完全无效。想让PHP错误也进采集管道,得自己动手:
- 统一用
error_log(json_encode($data), 4)输出结构化内容到stderr - 避免混用
error_log("string")和error_log($arr, 4),后者会触发警告 - Monolog等库需显式配置Handler为
StreamHandler('php://stderr'),不能依赖默认
最常被忽略的一点:PHP错误日志路径和Caddy日志路径是两个世界,强行指望它们自动合并,只会导致排查时两边都找不到线索。



















