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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 17:57:28