生产环境必须禁用 notice 日志:需同时在 php 层(error_reporting 关闭 e_notice)和 monolog 层(各 channel level 设为 warning 及以上)双重控制,并修复代码中未定义变量、数组键缺失等根本问题。

生产环境不该出现 Notice 级别日志,一旦大量刷出,说明代码存在未处理的弱类型隐患、未声明变量、数组键缺失或废弃函数调用等问题——它不阻断执行,但会快速撑爆磁盘、干扰错误定位,且暴露潜在运行风险。
为什么 Notice 日志在生产环境特别危险
Hyperf 默认配置下,Monolog\Logger::NOTICE 会被记录(尤其当 level 设为 DEBUG 或 INFO 时),而 PHP 的 Notice 错误本身不会抛异常,容易被忽略。但在高并发协程中,每请求触发一次 Notice,QPS=1000 就意味着每秒千条无意义日志写入,BufferHandler 都缓不住。
- 不是“日志太多”,而是“本不该存在”:PHP
Notice是开发阶段必须修复的问题,不是运行时可观测事件 -
error_reporting和日志level是两层控制:前者决定是否触发 PHP 错误处理器,后者决定 Monolog 是否落盘;两者都得关 - Hyperf 的
LoggerFactory不会自动过滤 PHP 原生Notice,它只管你调用$logger->notice()这种显式日志
确认 Notice 来源是 PHP 运行时还是业务代码调用
先区分两类来源,再针对性处理:
Hyperf 3.2.3于2026年7月30日发布,是3.2分支的官方维护版本,新增支持函数,并修复模型注释、缓存组件文档、数据库模型构建器注释和关联预加载字段等问题。
- 如果是
PHP Notice: Undefined index: xxx、PHP Notice: Trying to access array offset on value of type null这类以PHP Notice:开头的行,属于 PHP 解释器触发的运行时通知,由set_error_handler捕获并交由 Monolog 记录 —— 这类必须从代码层修复,不能靠调低日志等级掩盖 - 如果是
[notice] xxx这种由$logger->notice('xxx')主动打的日志,则属于业务逻辑误用,应搜索全项目->notice(并替换为->info()或删掉 - 检查
config/autoload/logger.php中各 channel 的level是否设为Monolog\Logger::NOTICE或更低(如DEBUG);生产环境推荐统一设为Monolog\Logger::WARNING
修改 logger.php 配置关闭 NOTICE 及以下级别
直接在 config/autoload/logger.php 的每个 channel 配置中收紧 level:
'channels' => [
'default' => [
'level' => Monolog\Logger::WARNING, // 关键:跳过 NOTICE/INFO/DEBUG
'handlers' => [...],
],
'sql' => [
'level' => Monolog\Logger::ERROR, // SQL 通道更严格,只记 ERROR 及以上
],
],
- 不要依赖环境变量动态设
level,避免LOG_LEVEL=debug在生产漏出 - 如果用了多通道(如
access、sql),每个都要单独设level,因为default不会继承给其他 channel - 注意:改完需重启服务(
php bin/hyperf.php server:stop && php bin/hyperf.php server:start),Hyperf 不热更日志 level 配置
彻底禁用 PHP 原生 Notice 的错误报告
即使日志 level 设为 WARNING,PHP 仍可能把 Notice 送进错误处理器并尝试记录——最稳妥是让 PHP 根本不触发它们:
- 在
config/autoload/constants.php或入口文件bin/hyperf.php顶部加:error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_USER_NOTICE);
- 确保
php.ini中error_reporting = E_ALL & ~E_NOTICE(容器部署时尤其要检查) - 该设置不影响
$logger->warning()等显式调用,只屏蔽 PHP 自身的弱提示 - 上线前务必用
php -l app/扫描语法,并 grep 全项目undefined index、Trying to access array offset等关键词定位真实问题
真正要解决的从来不是“怎么不让日志显示”,而是“为什么会有 Notice”。配置只是兜底,代码修复才是终点。忽略 Notice 等于纵容隐患在生产环境静默积累——某次小版本更新后,它可能突然升级成 Fatal error。










