frankenphp 日志只输出错误需同时配置:php.ini 中设 error_reporting = e_error | e_parse | e_core_error | e_compile_error | e_user_error 且 log_errors = on,并用 --no-access-log 关闭访问日志,指定 error_log 路径以配合轮转。

FrankenPHP 的日志级别怎么设成只输出错误
FrankenPHP 默认会输出 access log 和 error log,但它的 error log 实际上包含 notice、warning、error 等多个等级。要让运行日志「只保留错误信息」,关键不是过滤日志文件,而是控制 PHP 的错误报告级别和 FrankenPHP 自身的日志输出粒度。
FrankenPHP 本身不提供 log_level=error 这样的开关,它复用 PHP 的错误处理机制 + SAPI 层日志委托。所以真正起效的是两层配置:
-
php.ini中的error_reporting和log_errors - FrankenPHP 启动时通过环境变量或配置控制其 SAPI 日志行为(比如是否把
stderr全量透传)
修改 php.ini 的 error_reporting 值
这是最直接有效的一步。FrankenPHP 启动时加载的 php.ini 必须显式关闭非错误级日志,否则即使日志写入文件,也会混入 warning 或 notice。
在你的 php.ini 中设置:
error_reporting = E_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR log_errors = On display_errors = Off
注意:E_WARNING 和 E_NOTICE 不能出现在值里;E_ALL & ~E_DEPRECATED & ~E_STRICT 这类写法依然会输出 warning,不符合「只保留错误」要求。
验证方式:写个测试脚本触发 warning:
trigger_warning('this should NOT appear');
trigger_error('this MUST appear', E_USER_ERROR);
执行后检查日志文件,只有第二行生效才算配置成功。
禁用 FrankenPHP 的 access log 和冗余 stderr 输出
FrankenPHP 默认启用 access log(HTTP 请求记录),它虽然不算「错误日志」,但会大量刷屏,干扰排查。同时,如果用 frankenphp run 直接启动,未重定向 stderr,PHP 的 var_dump()、echo 到 STDERR 也会混进日志流。
推荐做法:
- 用
--no-access-log启动参数关闭 access log:frankenphp run --no-access-log - 确保 PHP 不向
stderr写非错误内容:检查代码中没有裸echo/print到STDERR,或用ini_set('log_errors_max_len', 0)避免截断导致误判 - 若用 Docker,建议重定向:
frankenphp run 2>&1 | grep --line-buffered "PHP [Ee]rror\|PHP Fatal"—— 但这只是临时过滤,不替代error_reporting设置
日志路径与轮转别被忽略
即使只输出错误,日志文件仍会持续增长。FrankenPHP 默认把 error_log 写到 stderr,也就是终端或容器 stdout/stderr 流。如果你没指定 error_log 文件路径,就无法配合 logrotate 或云平台日志采集器做归档。
务必在 php.ini 显式指定:
error_log = /var/log/frankenphp/error.log
然后确保该目录可写,并配好 logrotate(尤其在生产环境)。否则某天磁盘写满,错误日志反而第一个消失——因为写不进去。
FrankenPHP 的日志精简本质是「PHP 错误策略 + SAPI 输出控制」的组合动作,单改某一处大概率漏掉 warning 或混入 access 日志。最容易被跳过的其实是 error_reporting 的位运算写法和 error_log 路径的持久化配置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











