ThinkPHP6仅记录error日志需设APP_DEBUG=false、配置channels.file.level=['error']、确保runtime/log/可写且路径正确,并注意404和致命错误的特殊处理逻辑。

要让 ThinkPHP6 只记录 error 级别日志,核心不是“加功能”,而是关掉其他级别、确保错误能真正落盘。很多配置看似正确却没效果,是因为线上环境默认不写日志,或路径/权限卡在第一步。
必须设为生产模式:APP_DEBUG = false
这是前提,不是可选项:
-
.env 文件中写死:
APP_DEBUG=false(无空格、无引号、无注释) - 若用 Nginx/Apache,需显式透传该环境变量,不能只靠 .env
- APP_DEBUG=true 时,所有错误直接输出到页面,
runtime/log/几乎为空
明确限定日志级别:level = ['error']
修改 config/log.php 中的 channels.file.level(不是顶层的 level):
- 写成:
'level' => ['error'] - 注意:空数组
[]表示记录所有级别;非空数组表示仅记录列出的级别 - 别只改顶层
'level'—— TP6 的日志通道是分层的,file 通道的 level 才生效
确保日志能真正写入文件
即使 level 配对了,日志也常因以下原因“静默失败”:
-
路径必须可写:确认
runtime/log/目录存在,且 Web 进程用户(如 www-data、nginx、IIS_IUSRS)有写权限
Linux 下可用:chmod -R 755 runtime/;再执行php -r "var_dump(is_writable('runtime/log'));"验证 -
path 别留空也不乱写:若想固定写入
runtime/log/error.log,设'path' => 'log/error.log'(注意是相对于runtime/) -
关掉 close 开关:确认
'close' => false(默认就是 false,但有人误开)
额外检查项(容易忽略)
这些不改,error 日志也可能不出现:
-
404 错误不算 error 级别:它是 HttpException,是否记录取决于
config/exception.php中'log' => true和config/log.php中'ignore_404' => false - 致命错误(Fatal/Parse)需要 shutdown hook:只有 APP_DEBUG === false 时 TP6 才注册该钩子,所以开发模式下 fatal 不进日志是正常行为
-
SQL 日志不会被 level=['error'] 拦住:sql 是独立级别,除非你显式加入
['error', 'sql'],否则它不会写——这反而是好事,避免干扰
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











