ThinkPHP 动态切换日志级别推荐通过环境变量 LOG_LEVEL 覆盖(如 putenv('LOG_LEVEL=error,sql')),或运行时调用 Log::setLevel();同时需在 database.php 中启用 logger.sql=true 才能输出 SQL 日志。

ThinkPHP 动态切换日志级别,核心是绕过配置文件的静态定义,改用运行时生效的方式——最直接有效的是通过环境变量 LOG_LEVEL 覆盖,或在代码中调用 Log::setLevel()(需注意生效时机和常驻进程限制)。
用环境变量动态覆盖(推荐,优先级最高)
在框架加载前设置环境变量,TP 会自动读取并覆盖 config/log.php 中的 level 配置。适用于部署、容器、CI/CD 等场景:
- 在
public/index.php开头(require框架入口前)添加:
- 值为英文逗号分隔的级别名,不能有空格,支持:
emergency、alert、critical、error、warning、notice、info、debug、sql - 例如设为
LOG_LEVEL=info,sql,debug,即可同时开启调试与 SQL 日志
代码中运行时修改(仅限请求生命周期内)
使用 Log::setLevel() 可临时调整当前请求的日志接收级别,但不改变已初始化的通道配置,且对 Swoole/RoadRunner 等常驻进程需谨慎:
- 在控制器或中间件中调用:
- 该操作只影响后续
Log::record()或快捷方法(如Log::error())是否被接收,不影响已写入缓冲的日志 - 若已通过
Log::channel('xxx')显式指定通道,其自身level设置仍起作用,setLevel()不会覆盖通道级过滤
配合数据库开关启用 SQL 日志(关键补充)
即使日志级别包含 sql,SQL 日志也不会产生,除非数据库层也开启记录:
- 在
config/database.php中确保:
- TP6.1+ 必须用
logger.sql;TP6.0 则是log_sql => true - 两者缺一不可:log.level 控制“收不收”,database.logger.sql 控制“产不产”
验证是否生效的小技巧
不要只看控制台输出,尤其在常驻进程或 CLI 模式下:
- 执行一条带参数的查询,如
Db::name('user')->where('id', 1)->find(); - 立刻检查
runtime/log/下最新日期文件(如20261104.log),搜索SQL:或占位符语句 - 若没出现,先确认
LOG_LEVEL是否含sql,再查database.php的logger.sql
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











