如何让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. 检查模型与配置的正确性
- 确认目标模型已经正确引入
LogsActivitytrait,且定义了日志规则:
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
相关产品推荐
相关产品推荐

