要真正禁止ThinkPHP6记录404日志,需同时设置config/log.php中'default'通道顶层的'ignore_404' => true,并确保Route::miss()等兜底逻辑不主动调用Log方法,且无中间件或钩子根据404状态码写日志。

ThinkPHP6 默认对 404 请求不记录日志,但若你发现 404 出现在日志里(比如 runtime/log/202610/xxx.log 中有 404 Not Found 条目),说明配置已被修改或中间件逻辑介入。要真正禁止记录 404,关键不是“关掉某个开关”,而是控制两个地方:日志忽略策略 + 路由兜底行为。
确认并设置 ignore_404 配置
这是最直接的控制项。在 config/log.php 中,确保包含:
-
'ignore_404' => true,(注意是 true,不是false) - 该配置必须位于
'default'通道的顶层,例如:[ 'default' => 'file', 'ignore_404' => true, 'channels' => [ ... ] ] - 不要把它写进某个具体 channel 的配置里(如
channels.file.ignore_404),那样无效
避免兜底路由主动写日志
如果你用了 Route::miss() 自定义 404 响应,注意别在里面手动调用 Log::error() 或 Log::info()。例如下面这种写法会强制记录:
- ❌ 错误示范:
Route::miss(function () { Log::error('404 for ' . request()->url()); return response()->view('404', [], 404); }); - ✅ 正确做法:只返回响应,不触发日志写入
检查是否有自定义异常处理干扰
404 在 TP6 中不是 PHP 异常,不会进 app_exception 类。但如果你在中间件或全局钩子里监听了响应状态码,并对 404 主动调用日志,那就需要清理这类逻辑:
立即学习“PHP免费学习笔记(深入)”;
- 搜索项目中所有
Log::、think\facade\Log::的调用,过滤出含404、not found、miss等关键词的行 - 特别检查
app/middleware.php或自定义中间件里的after方法
确认没有开启调试模式下的自动日志
开发环境若开启 app_debug => true,TP6 可能在调试面板中显示 404 提示,但不会写入文件日志——除非你额外启用了「调试日志」。检查 config/app.php 是否有:
-
'log' => ['level' => ['error', 'info', 'sql']]—— 若包含'info',而某些中间件把 404 当 info 记录,就会出现 - 建议生产环境设为
'level' => ['error'],并保持ignore_404 => true



















