Tìm hiểu cơ bản về Laravel Activitylog

I. Tổng quan

Trong các dự án hiện nay đa số đều ghi log, log rất quan trọng đặc biệt là đối với những dự án có nhiều quản trị viên. Trường hợp sử dụng log phổ biến là:

– Log thay đổi dữ liệu như thêm, sửa, xóa thì chúng ta sẽ cần biết dữ liệu trước và sau khi thực hiện 1 action

– Log request và response liên quan đến Bank…

Bài viết này mình sẽ chia sẻ cơ bản về cách cài đặt, sử dụng và truy vấn log. Trong bài viết mình sẽ sử dụng php version 7.4, laravel version 8 và Laravel Activitylog version v3.

II. Nội dung

1. Cài đặt

– Câu lệnh install

composer require spatie/laravel-activitylog

– Câu lệnh publish migration

php artisan vendor:publish --provider="Spatie\Activitylog\ActivitylogServiceProvider" --tag="migrations"

– Câu lệnh thêm mới table

php artisan migrate

– Câu lệnh publish config (Có thể bạn muốn publish config)

php artisan vendor:publish --provider="Spatie\Activitylog\ActivitylogServiceProvider" --tag="config"

2. Mô tả table lưu trữ log

log_nameTên của log thường dùng phân loại nhóm
descriptionMô tả log
subject_typeĐối tượng liên quan thông thường là model
subject_idId của đối tượng liên quan
causer_typeĐối tượng người thực hiện hành động thường là model người dùng
causer_idId của đối tượng thực hiện hành động
propertiesThông tin log thường lưu trữ dưới dạng JSON
Table activity_log

3. Sử dụng

3.1 Sử dụng trong model

Để sử dụng trong Model ta thêm như sau, ở đây mình sẽ VD sử dụng trong AdvertiserModel

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Spatie\Activitylog\Traits\LogsActivity;

class AdvertiserModel extends Model
{
    use LogsActivity;

    protected static $logAttributes = ['name', 'country'];

    protected static $logName = 'Log advertiser';

    public function getDescriptionForEvent(string $eventName): string
    {
        return "Advertiser has been {$eventName}";
    }
}

– $logAttributes: Là các thuộc tính mà ta muốn ghi log khi chúng thay đổi.

– $logName: Tên của log. Nếu không được chỉ định, mặc định là tên của bảng liên kết với model.

– getDescriptionForEvent: Dùng để tùy chỉnh mô tả dựa trên sự kiện được thực hiện trên model.

Ok Bây giờ Laravel Activity Log sẽ tự động ghi lại hành động vào bảng log khi một hành động được thực hiện trên mô hình của bạn (ví dụ: tạo, cập nhật, xóa)

3.2 Sử dụng trong Middleware (Log request và response)

– Tạo Middleware mới: Trước tiên ta cần tạo một Middleware, bạn có thể tạo một Middleware bằng lệnh sau VD Middleware của bạn có tên LogRequestsAndResponses:

php artisan make:middleware LogRequestsAndResponses

– Cập nhật Middleware  như sau

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Spatie\Activitylog\Models\Activity;

class LogRequestsAndResponses
{
    public function handle(Request $request, Closure $next)
    {
        $response = $next($request);

        $user = Auth::user(); // Thông tin người dùng hiện tại (nếu có)

        // Ghi log request
        Activity::create([
            'log_name' => 'request_response_log',
            'description' => "Request from {$request->ip()} to {$request->url()}",
            'causer_id' => $user ? $user->id : null,
            'causer_type' => $user ? get_class($user) : null,
            'properties' => ['method' => $request->method(), 'headers' => $request->header(), 'content' => $request->all()],
        ]);

        // Ghi log response
        Activity::create([
            'log_name' => 'request_response_log',
            'description' => "Response from {$request->url()} with status code {$response->status()}",
            'causer_id' => $user ? $user->id : null,
            'causer_type' => $user ? get_class($user) : null,
            'properties' => ['status' => $response->status(), 'content' => $response->content()],
        ]);

        return $response;
    }
}

– Đăng ký Middleware: Truy cập vào tệp app/Http/Kernel.php thêm tên Middleware vào mảng $middleware hoặc $routeMiddleware tùy thuộc vào việc bạn muốn áp dụng.

– Sử dụng: Middleware này sẽ tự động ghi log cho mỗi yêu cầu và phản hồi. Các hoạt động sẽ được ghi vào bảng log với tên log là request_response_log, và bạn có thể truy cập chúng như bất kỳ hoạt động nào khác được ghi bằng Laravel Activity Log.

4. Truy vấn cơ bản lấy thông tin log

– Lấy tất cả các hoạt động

use Spatie\Activitylog\Models\Activity;
$activities = Activity::all();

– Lọc hoạt động theo người dùng cụ thể

$userActivities = Activity::where('causer_id', $userId)->get();

– Lấy các hoạt động của một model cụ thể

$modelActivities = Activity::where('subject_type', 'App\Models\AdvertiserModel')->get();

– Lấy các hoạt động theo loại (log name):

$advertiserActivities = Activity::where('log_name', 'Log advertiser')->get();

III. Kết luận

Trên đây là cơ bản những gì mình tìm hiểu được về cách mà Laravel Activitylog áp dụng vào Model, Middleware trong dự án Laravel. Các bạn có thể truy cập vào link bên dưới để tìm hiểu chi tiết hơn về Laravel Activitylog

https://spatie.be/docs/laravel-activitylog/v3/introduction


Cảm ơn các bạn đã đọc!

Related Posts