frankenphp 本身不提供独立访问日志开关,其日志能力完全继承自 caddy;需在 caddyfile 的站点路由块中显式配置 log 指令,指定 output file 和 format(如 json),并注意权限、代理 ip 还原及日志轮转。

FrankenPHP 本身不提供独立的“访问日志”开关,它的日志能力完全继承自底层 Caddy。Caddy 默认不记录常规 access log,必须显式配置才能输出类似 Nginx access_log 的请求记录。
要让 FrankenPHP 记录所有网站访问请求(含路径、IP、状态码、时间等),核心是修改 Caddyfile,在 HTTP 路由块中启用 log 指令。
✅ 正确开启访问日志的方法
在你的 Caddyfile 中,对应站点的路由块内添加 log 块:
https://example.com {
php_server
log {
output file /var/log/caddy/access.log
format json
}
}
说明:
-
output file ...:指定日志写入的绝对路径,需确保 FrankenPHP 进程有写权限(如/var/log/caddy/目录存在且可写)。 -
format json:推荐使用 JSON 格式,结构清晰、易解析;也可用format single_field common_log输出 Apache 风格文本。 -
log必须放在php_server后面或同级,不能嵌套在其他指令内部(如不能放在@rule里)。
⚠️ 注意:FrankenPHP 不识别
access_log /path这类 Nginx 写法,也不读取 PHP 的error_log设置来记录 HTTP 请求 —— 它只认 Caddy 原生log指令。
? 日志内容包含什么?
默认格式下,每条日志至少含:
-
request.remote_addr(客户端真实 IP,注意:若前端有代理,需配trusted_proxies) -
request.method(GET/POST 等) -
request.uri(完整路径,如/admin/users?limit=10) -
status(HTTP 状态码,如 200、404、500) -
request.duration(处理耗时,单位秒) -
request.user_agent(可选,需在format中显式声明)
如需更细粒度字段,可用自定义格式:
log {
output file /var/log/caddy/access.log
format json {
time request.time
ip request.remote_addr
method request.method
uri request.uri
status status
size response.size
ua request.header.User-Agent
}
}
? 关于代理与真实 IP
如果你的 FrankenPHP 前面还有一层反向代理(如 Cloudflare、Nginx),默认 request.remote_addr 会是代理 IP。要还原真实用户 IP:
- 在 Caddyfile 顶部或站点块内加:
{
trusted_proxies 127.0.0.1 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
}
- 并确保代理正确设置了
X-Forwarded-For或CF-Connecting-IP头。
否则日志里的 IP 将全部是 127.0.0.1 或代理内网地址。
? 补充:是否需要 PHP 层再记一次日志?
一般不需要。FrankenPHP 的 Caddy 日志已覆盖全部 HTTP 请求(包括静态文件、PHP 脚本、404 页面等)。
除非你有特殊需求,比如:
- 只记录进入
index.php的请求(排除图片/CSS/JS) - 需在 PHP 中注入业务上下文(如用户 ID、订单号)
那才考虑在 PHP 入口加 error_log() 或调用 syslog(),但这是额外审计,不是替代 access log。
? 最后提醒
- 日志文件需定期轮转,避免无限增长。Caddy 不自带 logrotate,建议配合系统
logrotate工具; - 生产环境建议关闭
display_errors,但log_errors on应保持开启,确保 PHP 错误也落盘; - 不要试图用 PHP 的
file_put_contents()在每个请求里手动写访问日志 —— 高并发下极易阻塞、丢日志、拖慢响应。
FrankenPHP 的日志机制干净直接,配对 Caddyfile 就生效,无需改 PHP 代码或装插件。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











