You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Spatie Activity Log捕获Laravel队列与调度任务中的操作?

解决方案:队列任务中捕获Spatie Activity Log日志

1. 先补全租户上下文

多租户架构下,队列任务不会自动携带租户信息,Activity Log不知道该往哪个租户的表写日志,这是最常见的原因。在队列任务的handle方法开头手动切换租户:

public function handle()
{
    // 假设你的租户模型是Tenant,任务接收tenant_id参数
    $tenant = Tenant::find($this->tenantId);
    // 替换成你项目里的租户切换方法,比如Tenancy::setTenant($tenant)(如果你用tenancy for laravel)
    $tenant->makeCurrent();

    // 后续执行ORM更新操作
    $model = YourTargetModel::find($this->modelId);
    $model->update(['your_field' => 'new_value']);
}

2. 手动触发日志记录(自动触发失效时用)

队列环境里没有HTTP请求上下文,模型的自动日志触发可能因为缺少用户信息或请求环境失效,这时候可以手动调用日志方法:

方式一:用模型自带的日志方法

$model = YourTargetModel::find($this->modelId);
$model->update(['your_field' => 'new_value']);
// 手动触发更新日志
$model->logUpdated();

方式二:用activity()辅助函数自定义记录

$model = YourTargetModel::find($this->modelId);
$oldData = $model->getOriginal();
$model->update(['your_field' => 'new_value']);
$newData = $model->getAttributes();

activity()
    ->performedOn($model)
    // 如果需要记录操作用户,从任务参数传userId,这里手动设置
    ->causedBy(User::find($this->userId))
    ->withProperties([
        'old' => $oldData,
        'new' => $newData
    ])
    ->log('更新了字段内容');

3. 检查模型与配置的正确性

  • 确认目标模型已经正确引入LogsActivity trait,且定义了日志规则:
use Spatie\Activitylog\Traits\LogsActivity;

class YourTargetModel extends Model
{
    use LogsActivity;

    protected function getActivitylogOptions(): ActivitylogOptions
    {
        return ActivitylogOptions::defaults()
            ->logAll() // 或者指定要记录的字段,比如logOnly(['your_field'])
            ->logOnlyDirty();
    }
}
  • 检查config/activitylog.php里的enable_logging配置,别在队列环境里被环境变量禁用了。

4. 补全用户上下文(如果日志需要记录操作用户)

如果你的日志需要记录caused_by字段,队列里默认没有当前用户,得在任务里传userId并手动设置:

// 任务构造函数接收必要参数
public function __construct(public int $modelId, public int $tenantId, public int $userId) {}

public function handle()
{
    $tenant = Tenant::find($this->tenantId);
    $tenant->makeCurrent();

    // 登录用户,让Activity Log自动捕获caused_by
    auth()->loginUsingId($this->userId);

    $model = YourTargetModel::find($this->modelId);
    $model->update(['your_field' => 'new_value']);
}

5. 确认数据库连接正确性

如果多租户用的是独立数据库,切换租户后要确保队列任务用的是当前租户的数据库连接,不然日志会写到错误的库。一般正规多租户包切换租户后会自动切换连接,自定义实现的话要额外确认。


内容的提问来源于stack exchange,提问作者Test Test

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 04:02:15