thinkphp6数据库debug日志需精准清理:先查实际路径(php think log:list),再用find按修改时间删7天前的日期子目录(如202608/),禁用sql_explain或调低log.level,生产环境关闭app_debug,并推荐自定义命令+定时任务自动化清理。

开启数据库 debug 后,ThinkPHP6 会把每条 SQL 执行详情写入 runtime/log/ 下的日期子目录(如 runtime/log/202609/)或 runtime/sql/ 目录,日志增长极快。清理关键不是“全删”,而是精准剔除旧文件、保留有效调试信息,同时避免中断运行。
确认实际日志位置和生成逻辑
别凭经验删 runtime/log/ 整个目录——它可能混着 session、trace 等临时文件。先执行:
-
php think log:list查看当前生效的日志路径 - 检查配置:
config('log.path')或config('database.sql_explain')是否启用了 SQL 日志独立输出 - 注意:若
app_debug = true且log.level包含sql,SQL 日志默认进runtime/log/;若显式配置了'sql' => ['type' => 'file', 'path' => RUNTIME_PATH.'sql/'],则会单独存到runtime/sql/
安全清理带日期的日志子目录
ThinkPHP 按天/月创建子目录(如 202608/、20260915/),当天目录不能删。推荐用 find 按修改时间过滤:
- 只删
runtime/log/下 7 天前的日期命名子目录:find runtime/log/ -maxdepth 1 -type d -name "202[0-9][0-9][0-9]*" -mtime +7 -exec rm -rf {} \; - 同样处理
runtime/sql/(如有):find runtime/sql/ -maxdepth 1 -type d -name "202[0-9][0-9][0-9]*" -mtime +7 -exec rm -rf {} \; - 执行前加
-print预览匹配项,防止误删:find runtime/log/ -maxdepth 1 -type d -name "202[0-9][0-9][0-9]*" -mtime +7 -print
禁用冗余 SQL 日志输出
debug 开着但不需要每条 SQL 都记,可缩小日志源头:
- 关闭 SQL 解释日志:
'sql_explain' => false(config/database.php) - 降低日志级别:将
log.level中的sql移除,只留error或warn - 生产环境务必设
app_debug = false,此时 SQL 日志自动关闭,无需手动清理
用自定义命令定时执行(推荐)
手动清理易遗漏,建议写一个专用命令(如 app/command/ClearOldSqlLog.php),在 handle() 中调用:
- 用
filemtime()判断子目录最后修改时间,比字符串匹配更可靠 - 跳过当前日期目录(如今天是 20260918,不删
20260918/和202609/) - 加入日志记录:
file_put_contents(runtime_path().'log/clean_sql.log', date('Y-m-d H:i:s')." cleaned\n", FILE_APPEND); - 配合 Linux
cron每日凌晨执行:0 2 * * * cd /path/to/project && php think clear:sql-log >> /dev/null 2>&1
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











