本文目录导读:

在 Laravel 中,模型事件本身不会自动记录日志,但你可以很方便地利用模型事件来实现日志记录功能。
Laravel 提供了模型事件(如 created, updated, deleted 等),你可以监听这些事件,并在事件触发时手动编写代码来记录日志。
以下是几种常见的实现方式:
在模型中使用 boot() 方法(最直接)
在每个模型里,重写 boot() 方法,并监听事件,在闭包中记录日志。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Log;
class User extends Model
{
protected static function boot()
{
parent::boot();
// 当用户被创建时记录日志
static::created(function ($user) {
Log::info('用户创建成功', ['user_id' => $user->id, 'email' => $user->email]);
});
// 当用户被更新时记录日志
static::updated(function ($user) {
Log::info('用户信息更新', [
'user_id' => $user->id,
'changed_fields' => $user->getDirty() // 获取发生变化的字段
]);
});
// 当用户被删除时记录日志
static::deleted(function ($user) {
Log::warning('用户被删除', ['user_id' => $user->id, 'name' => $user->name]);
});
}
}
使用观察者类(Observer,推荐用于复杂场景)
当需要在一个地方管理多个模型的事件,或者记录逻辑比较复杂时,建议使用观察者。
步骤 1:创建观察者
php artisan make:observer UserObserver --model=User
步骤 2:在观察者中编写日志逻辑
<?php
namespace App\Observers;
use App\Models\User;
use Illuminate\Support\Facades\Log;
class UserObserver
{
public function created(User $user)
{
Log::channel('model_events')->info('用户创建', ['data' => $user->toArray()]);
}
public function updated(User $user)
{
Log::channel('model_events')->info('用户更新', [
'original' => $user->getOriginal(), // 更新前的数据
'changes' => $user->getChanges() // 更新后的数据
]);
}
public function deleted(User $user)
{
Log::channel('model_events')->warning('用户删除', ['data' => $user->toArray()]);
}
// 还有 restored(), forceDeleted() 等事件
}
步骤 3:在 AppServiceProvider 中注册观察者
<?php
namespace App\Providers;
use App\Models\User;
use App\Observers\UserObserver;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
User::observe(UserObserver::class);
}
}
如需更专业的日志管理(推荐生产环境)
如果你需要将模型变更记录到数据库(而非只是日志文件),可以考虑:
- 使用数据包(Package):如
spatie/laravel-activitylog,它会自动记录模型的创建、更新、删除等操作,并存储到activity_log表中,支持自定义描述和因果关系。 - 构建自己的日志模型(Activity Log):创建一个
ActivityLog模型和对应的数据库表,在观察者中向该表写入记录。
示例(使用 spatie/laravel-activitylog):
// 安装后,在模型中加入 trait
use Spatie\Activitylog\Traits\LogsActivity;
class User extends Model
{
use LogsActivity;
protected static $logAttributes = ['*']; // 记录所有字段
protected static $logName = 'user'; // 日志名称
}
| 方式 | 适用场景 | 日志存储 |
|---|---|---|
boot() 方法 |
简单、少量模型 | 文件(Log::info) |
| Observer 观察者 | 复杂逻辑、管理多个模型 | 文件或数据库 |
| 专业 Package | 需要审计、追溯、UI 查看 | 数据库 |
推荐做法:如果只是开发调试,使用 boot() 快速记录到日志文件;如果是生产环境需要审计功能,建议使用 spatie/laravel-activitylog 或自己构建 Activity Log 模型来记录到数据库。