frankenphp 单文件默认日志输出到 stdout/stderr;需在 caddyfile 中显式配置 log 指令指定文件路径,php 业务日志须用 monolog 等可靠方式写入固定路径,并配套 logrotate 配置。

FrankenPHP 单文件交付后,日志默认不自动落盘——它不会像传统 PHP-FPM 那样写入 /var/log/php-fpm.log,也不会把应用日志塞进框架的 storage/logs/。你得明确告诉它“写到哪”,否则日志就只在终端 stdout 一闪而过,客户重启服务就全丢了。
FrankenPHP 默认日志输出位置在哪
单文件运行时(如 ./frankenphp run),所有日志——包括 Caddy 的访问日志、PHP 错误、worker 启动信息——都直接输出到进程的标准输出(stdout)和标准错误(stderr)。这意味着:
- 如果你用
systemd或supervisord启动,日志由这些进程管理器捕获,路径取决于其配置(如 systemd 的journalctl -u frankenphp) - 如果直接前台运行(
./frankenphp run),日志打印在终端,关掉终端就消失 - 如果用
nohup ./frankenphp run &,日志会落到nohup.out,但不可靠、无轮转、难排查
怎么让日志落到指定文件(最常用方案)
FrankenPHP 基于 Caddy,所以日志配置走 Caddyfile。你必须显式启用 log 指令,并指定输出目标。例如:
log {
output file /var/log/frankenphp/access.log
format json
}
注意三点:
-
output file路径必须由运行用户(如www-data)有写权限,否则启动失败或静默丢日志 - PHP 应用自身的业务日志(比如订单、登录)仍需你代码里写,
log指令只管 HTTP 层访问/错误日志 - Caddy 不自带日志轮转,得靠外部工具(如
logrotate)或改用syslog输出
PHP 应用日志该往哪写(别碰 error_log())
客户环境不可控,error_log() 极易失效:路径权限不对、并发写乱序、没锁、不轮转。正确做法是:
- 用
Monolog+StreamHandler写入固定路径,如/var/log/myapp/app.log,并确保目录存在且可写 - 若客户允许网络外发,用
SocketHandler直推远程tcp://log-collector:5044(Filebeat 端口),绕过本地磁盘 - 绝对不要依赖
php.ini的error_log设置——单文件交付时你无法控制客户机器上的 php.ini
交付前必须检查的三件事
单文件交付不是“扔个二进制完事”,日志链路一旦断掉,客户出问题你连第一手线索都没有:
- 确认 Caddyfile 里有
log块,且output file路径是绝对路径、不在/tmp这类易清空目录 - PHP 代码中所有业务日志必须走封装好的 logger(推荐 Monolog),禁止裸调
error_log()或file_put_contents() - 给客户附上最小化
logrotate配置示例,或说明“如需日志轮转,请部署以下规则”——别假设客户懂运维
log 配置,客户环境就只剩黑屏和沉默。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











