frankenphp 多站点日志分离需在 caddyfile 每个 server 块内单独配置 log 指令并指定不同文件路径,php 错误日志则须通过 php.ini 或入口脚本手动设置 error_log 实现分离。

FrankenPHP 多站点日志分离靠 Caddy server 块作用域
FrankenPHP 本身不提供“按域名自动分日志”的开关,日志分离完全依赖 Caddy 的配置模型:每个 server 块是独立作用域,log 指令只对当前块生效。你不能在全局写一次 log 就让所有站点日志分开,必须为每个站点显式配置各自的 log 输出路径。
Caddyfile 中每个 server 块都要配独立 log 指令
常见错误是只在最上面加一个 { log } 全局块,结果所有请求日志混在同一个文件里。正确做法是把 log 放进每个 server 块内部,并指定不同路径:
example.com {
root /var/www/example/public
php_server { try_files {path} /index.php }
log {
output file /var/log/frankenphp/example-access.log
}
}
api.example.com {
root /var/www/api/public
php_server { try_files {path} /index.php }
log {
output file /var/log/frankenphp/api-access.log
}
}
-
log必须在server块内,不能提出来; -
output file路径需提前创建目录并确保 FrankenPHP 进程有写权限(如chown www-data:www-data /var/log/frankenphp); - 不要复用同一路径,否则多个站点会互相覆盖或追加到同一个文件;
- 如果只想要终端输出(如 Docker 环境),可省略
output,但此时所有站点日志仍会混在 stdout/stderr —— 分离只能靠容器引擎或docker logs -f加--since时间过滤。
PHP 错误日志不能靠 Caddy log 分离
Caddy 的 log 只管 HTTP 层(状态码、路径、耗时),PHP 运行时错误(Fatal error、Warning)走的是 PHP 自身机制,由 php.ini 的 error_log 配置决定。要实现 PHP 错误也按站点分离,得在每个站点的入口脚本(如 public/index.php)开头手动设置:
<?php // public/index.php 开头
error_log("/var/log/frankenphp/example-php-errors.log");
ini_set('log_errors', 'On');
ini_set('error_log', '/var/log/frankenphp/example-php-errors.log');
// 后续 include 或 require 其他文件
- 这个设置只对当前请求生效,必须放在每个站点的主入口第一行;
- 不能靠环境变量或全局
php.ini实现分离,因为所有站点共享同一 PHP 进程池; - 记得检查
log_errors = On在实际生效的php.ini中已开启(可用frankenphp php-cli -i | grep log_errors确认); - 日志路径需绝对路径,相对路径容易因工作目录变化而写错位置。
logrotate 必须为每个日志文件单独配规则
你为每个站点配了不同日志路径,logrotate 就不能偷懒只配一个通配符。比如你有 /var/log/frankenphp/example-access.log 和 /var/log/frankenphp/api-access.log,就得在 /etc/logrotate.d/frankenphp 里分别写两段:
/var/log/frankenphp/example-access.log {
daily
missingok
rotate 30
compress
copytruncate
create 644 www-data www-data
}
/var/log/frankenphp/api-access.log {
daily
missingok
rotate 30
compress
copytruncate
create 644 www-data www-data
}
- 漏掉任一路径,对应日志就会无限增长;
-
copytruncate是关键,它保证 FrankenPHP 进程持续写入不中断; - 别用
/var/log/frankenphp/*.log通配——如果某天加了临时 debug 日志文件,会被意外卷入轮转,导致服务异常; - 测试是否生效:运行
sudo logrotate -f /etc/logrotate.d/frankenphp,然后ls -lh /var/log/frankenphp/看对应.1文件是否生成。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











