ThinkPHP6通过file通道的apart_level配置实现日志级别隔离,需设为小写数组如['info','error','sql'],path指向可写目录,single=false,并在通道level中明确启用对应级别,SQL日志由Log::sql()或数据库自动触发。

ThinkPHP6 的独立日志级别通道,核心是让不同日志级别(如 info、sql、error)各自写入独立文件,避免混在同一个日志里。这靠的是 apart_level 配置项,不是新建多个通道,而是对单个通道启用分级隔离。
在 file 通道中开启 apart_level
打开 config/log.php,找到 'file' 通道配置(通常是 'channels' => ['file' => [...]]),在里面添加或修改:
-
'apart_level' => ['info', 'error', 'sql']—— 值必须是小写字符串数组,每个元素对应一个日志级别 -
'path' => runtime_path() . 'log/'—— 确保路径存在且 PHP 进程可写,末尾带斜杠更稳妥 -
'single' => false—— 必须为false,否则apart_level不生效(单文件模式下不分级)
确认全局 level 允许目标级别
apart_level 只决定“怎么分文件”,不决定“记不记”。要让某条日志落地,它还必须通过全局或通道级 level 过滤:
- 若想记录
Log::info(),需确保'level'数组中包含'info' - 推荐在
'file'通道内部单独配'level' => ['info', 'error', 'sql'],优先级高于全局 level - 不要写成
'level' => 'info,error'或['INFO'],只接受小写字符串数组
SQL 日志要单独走 sql 级别
TP6 把 SQL 日志当作一种特殊级别('sql'),不是靠 DB 驱动开关,而是靠日志系统识别 Log::sql() 或数据库自动触发的 sql 级别日志:
立即学习“PHP免费学习笔记(深入)”;
- 确保
'apart_level'包含'sql' - 数据库配置中开启日志:
'log' => true(默认已开) - 不需要额外建
'sql'通道,除非你想把 SQL 日志存到完全不同的路径
验证是否生效
调用几条不同级别的日志后,检查 runtime/log/年月/ 目录下是否生成了对应文件,例如:
20261029_info.log20261029_error.log20261029_sql.log
如果没出现,先运行 php think clear:log 清缓存,再检查 runtime/log/ 目录权限和 apart_level 拼写是否全小写。



















