frankenphp 日志统一输出至 stdout/stderr,不依赖外部服务;开发用终端直查,生产用 journalctl 或 docker logs,php 错误可额外通过 php.ini 的 error_log 文件记录。

FrankenPHP 的日志机制和传统 Nginx + PHP-FPM 架构不同——它不依赖外部 Web 服务器或独立的 PHP-FPM 进程,而是将 HTTP 服务、TLS 终止、PHP 执行全部集成在一个二进制进程中。因此,它的运行日志是统一输出的主进程日志,而不是分散在多个位置(如 error_log、php_errors.log、php-fpm.log)。
查看 FrankenPHP 主进程日志
FrankenPHP 默认将所有日志(包括启动信息、HTTP 请求、PHP 错误、警告、致命错误、TLS 握手、Mercure 事件等)直接输出到标准输出(stdout)和标准错误(stderr)。这意味着:
- 如果你用
systemd启动,日志由journalctl管理 - 如果你前台运行(如
./frankenphp serve),日志直接打印在终端 - 如果你用 Docker,日志可通过
docker logs获取 - 它不默认写入磁盘文件,除非你显式重定向或配置了日志后端
✅ 推荐查看方式(按场景)
-
前台运行时(开发调试):
直接观察终端输出。例如:./frankenphp serve --document-root ./public
出现
Fatal error或Parse error时,会立即显示完整路径、行号、堆栈(类似 CLI 模式),无需查文件。 -
systemd 服务(生产部署):
使用 journalctl 实时追踪:sudo journalctl -u frankenphp -f # 或查看最近 100 行 sudo journalctl -u frankenphp -n 100
-
Docker 容器:
docker logs -f my-frankenphp-app # 或查看最近错误(含 PHP Fatal) docker logs my-frankenphp-app | grep -i "fatal\|error\|exception"
-
重定向到文件(需手动配置):
启动时可将 stdout/stderr 写入文件:./frankenphp serve --document-root ./public > /var/log/frankenphp.log 2>&1 &
然后用
tail -f /var/log/frankenphp.log实时查看。
PHP 错误是否单独记录?
FrankenPHP 复用 PHP 的原生日志机制,但行为略有差异:
-
log_errors = On且error_log已配置(如/var/log/php_errors.log)时,PHP 运行时错误(Fatal error、Warning等)仍会写入该文件 —— 和传统 PHP 一致。 - 但注意:FrankenPHP 不接管或覆盖这个行为;它只是“运行 PHP”,所以
php.ini中的error_log设置依然生效。 - 你可以用以下代码快速确认当前配置:
<?php echo ini_get('error_log') . "\n"; ?>如果返回空字符串,说明未设置
error_log,错误将回退到 FrankenPHP 主进程日志(即 stdout/stderr)。
✅ 建议做法:
同时启用两种日志源:
- 主进程日志(
journalctl/docker logs)用于看 HTTP 层、启动失败、TLS 问题; -
error_log文件(需在php.ini显式配置)专用于捕获 PHP 解析与执行错误,便于 grep 和长期归档。
快速定位异常的典型线索
日志中常见关键模式(可配合 grep 筛选):
-
PHP Fatal error:→ 致命错误,脚本终止,必查 -
PHP Parse error:→ 语法错误,通常带on line X -
PHP Warning:.*failed to open stream→ 文件路径、权限或include_path问题 -
Allowed memory size .* exhausted→ 内存超限,需调memory_limit -
Uncaught Error: Class .* not found→ 自动加载失败,检查 Composer 或 PSR-4 配置 -
Mercure: publish failed或HTTP/3 handshake failed→ 配置或网络层异常
⚠️ 注意:FrankenPHP 的错误堆栈默认包含完整调用链和源码上下文(尤其启用
display_errors=On时),比传统 FPM 更易读。
补充:如何增强日志可追溯性?
- 在
php.ini中开启详细报告:error_reporting = E_ALL log_errors = On error_log = /var/log/frankenphp-php-errors.log display_errors = Off ; 生产环境必须关
- 启动 FrankenPHP 时加
--debug参数(v1.1+ 支持)可输出更细粒度的内部调度日志; - 若使用 Mercure 或 HTTP/3,相关协议级错误也会出现在主日志中,无需额外排查。
不复杂但容易忽略:FrankenPHP 的日志入口只有一个,盯住 stdout/stderr 就抓住了全部脉搏。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











