frankenphp 无日志级别开关,http 日志由 caddy 全量记录(不支持 level 过滤),php 错误级别由 php.ini 的 error_reporting、display_errors 和 log_errors 决定,业务日志级别需应用层(如 monolog)自行控制。

FrankenPHP 本身不提供日志级别开关,HTTP 层日志(访问/错误)由 Caddy 控制,PHP 运行时日志级别则完全取决于 php.ini 的 error_reporting 和 display_errors 配置。
为什么 Caddy 的 log 指令没有 level 参数
Caddy v2 的 log 指令只负责“记录什么”,不控制“记录哪些严重程度的事件”——它默认记录所有 HTTP 事务(200、404、500 等),无法像 Monolog 那样过滤 debug 或屏蔽 notice。Caddy 不解析 PHP 错误级别,也不做条件写入。
- 想屏蔽 404 日志?不行,
log不支持level或filter语法 - 想只记录 5xx?得用外部工具(如 grep、fluentd)后处理,或改用自定义 PHP 日志输出
- Caddyfile 中写
log { level error }是无效配置,会启动失败并报错unknown field 'level'
PHP 错误级别必须靠 php.ini 控制
FrankenPHP 启动时加载的 PHP 配置决定哪些错误被触发、是否显示、是否记录。关键项只有三个:
-
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT(开发环境推荐) -
display_errors = On(仅开发;生产必须Off) -
log_errors = On(生产必须开,否则错误全丢)
用 frankenphp php-cli -i | grep error_reporting 确认实际生效值——单文件交付时,FrankenPHP 可能 fallback 到内置 php.ini,你配的系统级 /etc/php/*/cli/php.ini 不起作用。
业务日志级别要由 PHP 应用自己管
框架或自研日志器(如 Monolog)的日志级别才真正可控:
- Laravel:
config/logging.php中'channels' => ['stack' => ['level' => 'debug']] - Symfony:
config/packages/monolog.yaml中handlers: { main: { level: 'warning' } } - 裸写 PHP:
error_log(json_encode(['level' => 'info', 'message' => '...']), 0),然后由日志采集端(Logstash、SLS)按level字段过滤
别指望 FrankenPHP 或 Caddy 替你做 if ($level === 'debug') skip —— 它们不解析你的 JSON 结构,只原样写入。
容易忽略的陷阱:日志级别和日志目标是两回事
很多人调了 error_reporting = E_ERROR 却发现还是看到 warning,原因往往是:
- PHP 应用里用了
trigger_error('xxx', E_USER_WARNING),而E_USER_WARNING不受error_reporting默认掩码控制,需显式包含 - 框架中间件捕获了异常但没 re-throw,导致
set_error_handler未触发,错误“消失”在静默中 - 容器环境 stdout 被重定向,
display_errors = On输出到了docker logs,但你只盯着/var/log/frankenphp/error.log
最终日志可见性 = Caddy 是否写了 + PHP 是否触发了错误 + 错误是否被某层吞掉 + 输出目标你有没有在看。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











