laravel-admin操作日志不写入数据库的三大主因是:admin_operation_log表未创建(需手动运行php artisan migrate)、config/admin.php中operation_log.enable配置未生效(须清缓存)、请求未经过admin中间件栈(仅admin路由组内请求才记录)。

laravel-admin 安装后操作日志不写入数据库,不是因为没启用,而是因为日志表没建、配置没生效、或中间件没挂载——三者缺一不可。
admin_operation_log 表不存在
laravel-admin 的操作日志默认写入 admin_operation_log 表,但该表不会随 php artisan admin:install 自动创建(除非你手动运行了迁移)。
- 检查数据库中是否存在
admin_operation_log表;不存在就说明迁移未执行 - 运行
php artisan migrate(不是admin:install)补全缺失的迁移,关键迁移文件是2016_01_04_173148_create_admin_tables.php - 如果已存在其他 admin 相关表但缺这一个,可单独执行:
php artisan migrate --path=database/migrations/2016_01_04_173148_create_admin_tables.php - 注意:Laravel 9+ 默认使用
utf8mb4字符集,若 MySQL 版本较老(如 5.6),可能因索引长度报错,需在AppServiceProvider::boot()中加Schema::defaultStringLength(191)
config/admin.php 中 operation_log 配置未生效
即使表存在,operation_log.enable 若为 false 或被缓存覆盖,日志仍不会记录。
- 确认
config/admin.php中'operation_log' => ['enable' => true]已开启 - 修改配置后必须清缓存:运行
php artisan config:clear(开发环境不建议用config:cache,它会固化旧配置) - 检查是否在
.env中误设了ADMIN_OPERATION_LOG_ENABLE=false(部分定制版会读这个) - 若使用多环境配置(如
config/admin.production.php),确保当前环境加载的是正确文件
请求未经过 Admin 中间件栈
操作日志依赖 Encore\Admin\Middleware\PjaxMiddleware 和 Encore\Admin\Middleware\OperationLog,如果路由没走 admin 路由组,日志就完全不会触发。
- 确认你的请求路径匹配
admin前缀(如/admin/users),且由routes/admin.php定义 - 检查
app/Providers/AdminServiceProvider.php中是否注册了中间件:默认已包含,但若手动删过$this->app['router']->pushMiddlewareToGroup('admin', ...)就会失效 - 调试技巧:在
Encore\Admin\Middleware\OperationLog的handle()方法里加Log::debug('log middleware triggered'),看是否执行 - 注意:AJAX 请求若没带
X-PJAX头,可能跳过 PjaxMiddleware,但 OperationLog 本身不依赖它,只要进 admin 路由组就会执行
最容易被忽略的是:日志只记录通过 admin 路由进入的请求,直接访问 /api/xxx 或普通 web 路由,哪怕用了 admin 用户登录,也不会写入 admin_operation_log 表——它和 Laravel 自身的 storage/logs/laravel.log 是两套完全独立的日志体系。











