如何通过Spatie Laravel-activitylog仅追踪API特定时段的用户操作日志?
实现API特定时段的模型操作日志追踪
1. 创建API日志控制中间件
先生成中间件用于识别API请求并校验时段:
php artisan make:middleware ApiActivityLogFilter
在app/Http/Middleware/ApiActivityLogFilter.php中编写逻辑:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class ApiActivityLogFilter { public function handle(Request $request, Closure $next) { // 判断是否为API请求(可根据路由前缀/请求头调整,这里用/api前缀示例) $isApiRequest = str_starts_with($request->getPathInfo(), '/api'); // 校验是否在允许的时段内(示例:每日9:00-18:00) $currentHour = now()->hour; $isInAllowedTime = $currentHour >= 9 && $currentHour < 18; // 将判断结果存入请求属性,供后续日志逻辑使用 $request->attributes->set('should_log_activity', $isApiRequest && $isInAllowedTime); return $next($request); } }
2. 注册中间件
在app/Http/Kernel.php的$middlewareGroups中,给api分组添加该中间件:
protected $middlewareGroups = [ 'web' => [ // 原有web中间件 ], 'api' => [ \App\Http\Middleware\ApiActivityLogFilter::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];
3. 配置模型日志规则
针对需要追踪的模型,调整日志触发条件和记录事件:
use Spatie\Activitylog\Traits\LogsActivity; class Post extends Model { use LogsActivity; // 仅追踪增删改操作 protected static $recordEvents = ['created', 'updated', 'deleted']; // 自定义日志触发条件 public function shouldLogActivity(): bool { // 读取中间件设置的标记 return request()->attributes->get('should_log_activity', false); } // 可选:配置日志记录的字段(按需调整) protected function getActivitylogOptions(): \Spatie\Activitylog\LogOptions { return \Spatie\Activitylog\LogOptions::defaults() ->logOnly(['title', 'content']) ->logOnlyDirty(); } }
4. 全局统一控制(可选)
如果多个模型需要统一规则,可在AppServiceProvider中监听日志事件:
use Spatie\Activitylog\Events\ShouldLogActivity; public function boot() { Event::listen(function (ShouldLogActivity $event) { $request = request(); $shouldLog = $request->attributes->get('should_log_activity', false); // 确保仅触发增删改操作的日志 $allowedEvents = ['created', 'updated', 'deleted']; $isAllowedEvent = in_array($event->eventName, $allowedEvents); $event->shouldLog = $shouldLog && $isAllowedEvent; }); }
注意事项
- 时段规则可迁移到配置文件,比如在
config/app.php中添加activity_log_hours配置项,通过config()函数读取,方便灵活调整。 - 识别API请求的逻辑可根据实际场景修改,比如用
$request->wantsJson()判断是否为JSON请求。 - 若需排除特定API路由,可在中间件中加入路由名称/路径的判断逻辑。
内容的提问来源于stack exchange,提问作者princeallan
相关产品推荐
相关产品推荐

