EasyAdmin 操作日志系统解析:按月分表记录用户操作的设计思路
【免费下载链接】easyadmin框架主要使用ThinkPHP6.0 + layui,拥有完善的权限的管理模块以及敏捷的开发方式,让你开发起来更加的舒服。项目地址: https://gitcode.com/gh_mirrors/easy/easyadmin
EasyAdmin 是一个基于 ThinkPHP6.0 + layui 构建的开源后台管理框架,内置了完善的权限管理模块。其中它的操作日志模块设计得非常巧妙——采用按月分表的方式记录后台用户的操作行为,既保证了写入性能,又让日志查询、清理变得异常轻松。这篇文章就来拆解 EasyAdmin 操作日志按月分表的设计思路,帮助新手理解这套优雅的日志方案。
为什么操作日志要按月分表?
后台管理系统的操作日志有一个典型特点:数据量增长极快,但价值具有时效性。管理员每一次登录、增删改查都会被记录下来,一个月轻松积累几十万甚至上百万条数据。
如果所有日志都堆在一张表里,会带来两个痛点:
- 😣 单表数据量过大,
insert写入变慢,页面查询也卡顿 - 😣 想清理过期日志时,
delete大表数据性能极差,还容易锁表
按月分表则完美解决了这两个问题:写入分散到不同月份的表,查询按需定位,清理直接删表即可。这就是 EasyAdmin 选择按月分表的核心动机。
EasyAdmin 按月分表的核心实现:模型动态表名
EasyAdmin 操作日志分表的关键代码,藏在模型SystemLog的构造函数里。我们来看 app/admin/model/SystemLog.php 的核心逻辑:
public function __construct(array $data = []) { parent::__construct($data); $this->name = 'system_log_' . date('Ym'); }模型实例化时,自动把表名设置为system_log_当前年月,例如 2026 年 8 月就是system_log_202608。同时模型还提供了setMonth()方法,支持按指定月份切换表名,为后续的按月查询打下基础。
动态建表:日志表自动创建
光有分表思路还不够,月份更替后新表从哪来?EasyAdmin 的解决方案是写入时自动检测、自动建表,整个过程完全不需要人工干预。
核心实现在 app/admin/service/SystemLogService.php:
- 服务采用单例模式,实例化时从配置读取表前缀,拼出完整的按月表名
save()方法写入前先调用detectTable()检测表是否存在- 若表不存在,则通过
getCreateSql()动态生成建表语句并立即执行
整个流程可以用一句话概括:首次写入某月日志时,自动建好该月的表。这意味着系统跑多久都不需要人工建表,运维成本几乎为零。
操作日志是怎么被记录下来的?
EasyAdmin 通过全局中间件无侵入地记录日志,开发者完全不用在业务代码里写任何日志逻辑。中间件定义在 app/admin/middleware/SystemLog.php,主要做了三件事:
- 📝 只记录
POST、PUT、DELETE这类写操作的Ajax 请求,避免无意义的查询请求刷屏 - 🔒 对敏感字段自动脱敏,如
password、phone、mobile统一替换为******,防止密码等隐私信息落库 - 💾 收集管理员 ID、请求地址、请求方法、真实 IP、User-Agent、操作内容等字段,调用日志服务写入对应月份的表
这个设计非常贴心:自动脱敏从源头杜绝了敏感信息泄露,也让日志数据可以放心长期保存。
按月查询:前端筛选 + 后端定位
分表之后,查询也得跟着月份走。EasyAdmin 的日志列表页 app/admin/controller/system/Log.php 实现了按月切换查询:
- 前端 log.js 默认展示当月日志,并提供一个月份选择器
- 用户选择月份后,后端通过
setMonth($month)动态切换到对应月份的日志表 - 列表支持按操作人、请求方法、路由地址、IP、创建时间范围等条件筛选,并关联查询操作人信息
前端页面上,日志字段一目了然:后台用户、请求方法、路由地址、日志标题、操作内容、IP 地址、创建时间等,配合 layui 表格的搜索功能,排查问题非常顺手。
按月分表方案的优缺点总结
| 维度 | 表现 |
|---|---|
| 写入性能 | ✅ 单表数据量可控,写入稳定 |
| 查询效率 | ✅ 按月份定位表,查询速度快 |
| 数据清理 | ✅ 直接 DROP 旧月份表,秒级完成 |
| 代码复杂度 | ⚠️ 需要动态表名 + 自动建表逻辑 |
| 跨月统计 | ⚠️ 需要遍历多张表,稍显繁琐 |
总体来看,按月分表是日志类数据最经典的实践方案,尤其适合中小型后台管理系统。EasyAdmin 通过模型动态表名 + 服务层自动建表 + 中间件自动记录,把整套方案封装得开箱即用。
总结
EasyAdmin 的操作日志系统,用很轻量的代码实现了三个关键能力:按月自动分表、写入时自动建表、按月份灵活查询。它没有引入复杂的中间件或定时任务,纯粹依靠 PHP 层面对表名的动态控制,就把日志模块打理得井井有条。
对新手来说,这套设计是一份很好的学习样板——理解了 SystemLog 模型 与 SystemLogService 的配合方式,你就掌握了动态表名的常见套路,未来遇到类似的数据分片需求时,也能举一反三。
【免费下载链接】easyadmin框架主要使用ThinkPHP6.0 + layui,拥有完善的权限的管理模块以及敏捷的开发方式,让你开发起来更加的舒服。项目地址: https://gitcode.com/gh_mirrors/easy/easyadmin
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考