ThinkPHP6.1日志级别由log.level严格控制,默认不记录sql、debug等低级别日志;需在config/log.php中显式配置level数组(如['error','sql','notice']),并启用database.logger.sql=true才能记录SQL;环境变量LOG_LEVEL可动态覆盖,优先级更高;常驻进程下日志写入文件而非实时输出。

ThinkPHP6.1 的日志级别过滤不是“开了日志就能看到所有内容”,而是由 log.level 配置项严格控制——它像一道闸门,只放行你明确允许的级别,其余一律丢弃。默认配置下,sql、debug 等低级别日志根本不会进入写入流程,哪怕数据库查询执行了,也不会记录。
必须显式声明要记录的级别
仅配置 'type' => 'File' 不生效。你需要在 config/log.php 中明确列出所需级别:
-
'level' => ['error', 'sql', 'notice']—— 这样 SQL 语句和运行时提示才会被采集 - 若只写
['error'],则 SQL、debug、info 全部被过滤掉,Db::getLastSql()也查不到刚执行的语句 - 支持的级别包括:
emergency、alert、critical、error、warning、notice、info、debug、sql
环境变量方式(适合容器或部署脚本)
可通过 LOG_LEVEL 环境变量动态覆盖,但必须在框架加载前设置:
- 在
public/index.php顶部添加:putenv('LOG_LEVEL=error,sql'); - 值为英文逗号分隔字符串,不能有空格
- 该方式优先级高于配置文件,适合 CI/CD 或多环境统一管理
SQL 日志需额外开启数据库日志开关
即使 log.level 包含 sql,数据库日志仍需单独启用:
- TP6.1+:设置
database.logger.sql = true - 旧版 TP6.0:用
database.log_sql = true - 二者缺一不可——
log.level决定“是否接收”,database.logger.sql决定“是否产生”
注意 Swoole/RoadRunner 等常驻进程场景
这些环境下日志不实时刷屏,log.level 生效但输出延迟:
- 日志会写入
runtime/log/日期.log文件,而非直接打印到终端 - 调试时别盯着控制台等输出,应
tail -f runtime/log/20261029.log实时查看 - 如需立即落盘,可在代码中调用
Log::save(),但生产环境慎用
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











