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_name | Tên của log thường dùng phân loại nhóm |
description | Mô tả log |
subject_type | Đối tượng liên quan thông thường là model |
subject_id | Id 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_id | Id của đối tượng thực hiện hành động |
properties | Thông tin log thường lưu trữ dưới dạng JSON |
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!