ThinkPHP6支持多通道日志,可为登录、支付等业务独立配置路径、格式与保留策略;需在config/log.php中定义channels,通过Log::channel('xxx')调用,配合中间件可自动分流。

ThinkPHP6 默认使用单通道日志,所有记录都写入 runtime/log/ 下的日期文件。但实际项目中,你往往需要把不同业务的日志分开——比如登录行为单独存、支付回调单独存、API 接口错误另开一个目录,方便排查和运维监控。
关键不是“能不能分”,而是怎么让每个通道独立配置路径、格式、保留天数,又不互相干扰。
日志通道的配置方式
TP6 的日志系统支持多通道,本质是定义多个 channel,每个 channel 指向不同的驱动(如 File)并设置专属参数。配置不在全局 log.php 里硬编码,而是在 config/log.php 中通过 'channels' => [] 显式声明:
return [
'default' => 'file',
'channels' => [
'file' => [
'type' => 'File',
'path' => '',
'level' => ['error', 'info', 'debug'],
'realtime_write' => false,
],
'login' => [
'type' => 'File',
'path' => runtime_path() . 'log/login/',
'level' => ['info', 'error'],
'file_size' => 1024 * 1024 * 5, // 5MB
'backup_num' => 10,
],
'pay' => [
'type' => 'File',
'path' => runtime_path() . 'log/pay/',
'level' => ['info', 'notice', 'error'],
'format' => '[{date}] [{level}] {message} | {extra}',
],
],
];
注意三点:
-
path必须是绝对路径,建议用runtime_path()动态拼接,避免硬写/var/www/... - 同一 channel 不要和
default共用path,否则会混写 -
level控制该通道接收哪些级别日志,不影响其他通道
在代码中调用指定通道
不能直接用 Log::info(),那是走默认通道。要用 Log::channel('xxx') 显式切换:
// 写登录日志
Log::channel('login')->info('用户 {uid} 登录成功', ['uid' => 1001]);
// 写支付回调日志
Log::channel('pay')->notice('微信回调验签失败', ['order_no' => 'PAY20261029001']);
// 错误也按需分流
Log::channel('pay')->error('支付扣款异常', ['err_code' => $e->getCode()]);
这样 login/ 和 pay/ 目录下就会各自生成 20261029.log,内容完全隔离。
配合中间件或钩子自动分流(进阶)
如果不想在每个控制器里手动写 channel('xxx'),可以封装一个日志门面或在中间件中根据路由前缀自动绑定通道:
// app/middleware/LogChannel.php
public function handle($request, \Closure $next)
{
$action = $request->action();
if (str_starts_with($action, 'Login')) {
Log::useChannel('login');
} elseif (str_starts_with($action, 'Pay')) {
Log::useChannel('pay');
}
return $next($request);
}
再注册到全局中间件或路由分组即可。不过要注意:useChannel() 是运行时切换,默认通道仍为 'file',所以更适合轻量场景;高并发下推荐显式调用 channel() 更清晰可控。
文件权限与部署注意事项
- 确保
runtime/log/login/和runtime/log/pay/目录存在且 Web 用户可写(如www-data或nginx) - 生产环境建议关闭
debug模式下的trace日志,避免pay/通道被调试信息刷爆 - 若用容器部署,
runtime/目录应挂载为卷,防止日志随容器销毁丢失
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











