ThinkPHP6队列任务需隔离日志通道,通过配置独立queue日志通道、在Job中显式调用Log::channel('queue')记录、统一处理fail日志、可选按任务类型分流,实现日志独立可查。

让 ThinkPHP6 队列任务单独记录日志,核心是**隔离日志通道**——不走主应用的通用日志,而是为队列任务(尤其是 job 类)配置专属 logger 实例,写入独立文件或按需分类。
1. 创建专用日志配置
在 config/log.php 中新增一个独立日志通道,例如 queue:
- 指定唯一名称(如
'queue'),避免与default冲突 - 设置
'type' => 'file','path' => runtime/log/queue/(确保目录可写) - 可设
'single' => true,所有队列日志写入单个文件;或启用'apart_level' => ['info', 'error']按级别分文件 - 建议关闭 JSON 格式(
'json' => false),便于人工排查
2. 在 Job 类中使用专用 Logger
不要依赖全局 $logger 注入,而是在 job 的 handle() 方法里显式获取:
- 用
Log::channel('queue')获取通道实例(需use think\facade\Log;) - 或通过容器解析:
app('log')->channel('queue') - 记录时带上上下文,比如任务 ID、类名、参数摘要:
$log->info('SendNoticeJob started', ['job_id' => $this->job->getJobId(), 'data' => array_only($data, ['to_user_id', 'type'])]);
3. 统一处理失败与重试日志
队列任务常涉及重试机制,需明确区分“执行中”“失败”“最终丢弃”:
立即学习“PHP免费学习笔记(深入)”;
- 在
fail()方法里也调用同一 channel 记录错误详情(含异常堆栈) - 若启用了最大重试次数(如
attempts(3)),可在最后一次失败后加标记:$log->error('Job failed permanently', [...]); - 避免在
handle()外层 try-catch 吞掉异常——要让框架捕获并触发fail(),才能保证日志链完整
4. 可选:按任务类型分流日志
如果项目中有多种队列任务(如短信、站内信、报表生成),可进一步细化:
- 为每类 job 定义不同 channel,如
'sms_queue'、'notice_queue' - 在 job 构造函数或
handle()开头动态选择 channel:$log = Log::channel($this->logChannel ?? 'queue'); - 配合
config/queue.php的'table'或'queue'配置,实现日志与队列物理隔离



















