apart_level用于将指定级别日志从主日志中分离并单独写入文件,仅对file类型通道有效,受APP_DEBUG控制,且不依赖全局level配置。

ThinkPHP 6.1 的 apart_level 是用于日志分流的关键配置,它让指定级别的日志**绕过全局 level 过滤,单独写入独立文件**,但必须配合通道(channel)正确启用。配置不对,日志就只会混在主日志里,甚至完全不生成。
apart_level 的作用和生效前提
它不是“开启某级别日志”,而是“把某级别日志从主日志中切出来、另存为文件”。注意三个硬性前提:
-
只对 file 类型通道有效:必须在
config/log.php的某个'type' => 'File'通道里配置;数据库或 Socket 等通道不支持 -
受 APP_DEBUG 控制:比如
'sql'级别仅在APP_DEBUG = true时写入,生产环境关闭调试后自动失效 -
不依赖全局 level:即使你全局
'level' => ['error'],只要apart_level包含'info',info 日志仍会写进info.log
标准配置写法(以 file 默认通道为例)
在 config/log.php 的 'channels' => ['file' => [...]] 内添加:
'apart_level' => ['sql', 'error', 'warning']
这样会生成:
立即学习“PHP免费学习笔记(深入)”;
runtime/log/202610/29_sql.logruntime/log/202610/29_error.logruntime/log/202610/29_warning.log
注意:apart_level 中的值必须是小写字符串,['SQL'] 或 'sql,error' 均无效。
按业务分离日志(推荐做法)
比起依赖 apart_level,更灵活可控的方式是**显式定义专用通道**,例如支付日志:
'pay' => [ 'type' => 'File', 'path' => runtime_path() . 'log/pay/', 'level' => ['info', 'error'], 'single'=> true, 'filename' => 'pay.log', ],
然后调用:Log::channel('pay')->info('订单ID:1001 支付成功');
这种方式完全独立于全局 level 和 apart_level,适合审计类、第三方对接类等需长期留存的日志。
常见踩坑点
-
目录不可写:确保
runtime/log/pay/存在且 PHP 进程有写权限,否则静默失败 -
path 缺少尾部斜杠:写成
'path' => runtime_path() . 'log/pay'(没斜杠),会导致日志写成pay_pay.log -
通道名大小写错误:配置
'Pay',但代码调用Log::channel('pay')→ 报错Channel [pay] is not exists -
SQL 日志在生产环境不出现:不是配置问题,是
APP_DEBUG = false导致,属预期行为



















