实现 think/queue 日志分离
当我们使用think/queue包含了比较多的不同队列,日志会写到runtime/log目录下,合并写入的,不好排查问题,我们遇到一个比较严重的就是用了不同用户来执行,权限冲突了,导致部分队列执行不了.
为了解决以上问题,本来希望通过Log::init设置不同日志路径的,但是本地测试没生效,于是用了一下方案:
1. event中AppInit添加QueueLog
<?php
// 事件定义文件use app\common\event\QueueLog;return ['bind' => [],'listen' => ['AppInit' => [QueueLog::class],'HttpRun' => [],'HttpEnd' => [],'LogLevel' => [],'LogWrite' => [],],'subscribe' => [],
];
2. 创建QueueLog事件
<?php
namespace app\common\event;use think\App;
use think\facade\Request;class QueueLog
{public function handle(App $app): bool{if (!Request::isCli()) {return true;}$args = (array) $_SERVER['argv'];foreach ($args as $arg) {if (str_starts_with($arg, '--queue=')) {$queueName = substr($arg, 8);$app->setRuntimePath($app->getRuntimePath() . '/' . 'queue' . '-' . $queueName . '/');break;}}return true;}
}
这样的话,不同队列的日志就写到不同的路径下了