CMS后台操作日志记录,记录管理员所有操作
CMS后台操作日志记录的核心目标只有一句话:管理员在后台点了什么、改了什么、什么时候做的,都要留下可查询的记录。
本文按零基础运维视角,讲清准备条件、分步操作、避坑和验证方法,适合使用宝塔面板或LNMP环境搭建CMS的站长。
先确认你的CMS是否已有日志入口
动手前先做一次排查,避免重复造轮子。
登录CMS后台,按以下路径查找:
- 常见路径:
系统→操作日志、日志管理、安全审计 - 若存在日志菜单,先点击测试,确认能否记录“登录、新增、修改、删除”四类动作
- 若没有菜单或记录为空,再按本文手动补充日志表
判断条件:后台已有且能正常写入的,不需要重建表;
只有缺失或记录不全时,才进入下一步。
建立操作日志数据表
在宝塔面板打开 数据库,进入CMS所用数据库,执行下面的建表SQL。
字段覆盖“谁、何时、在哪、做了什么、结果如何”:
CREATE TABLE cms_admin_log (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
admin_id INT UNSIGNED NOT NULL,
admin_name VARCHAR(50) NOT NULL,
action VARCHAR(50) NOT NULL,
module VARCHAR(50) NOT NULL,
detail TEXT,
ip VARCHAR(45),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
表建好后,在宝塔 数据库 页面点击 phpMyAdmin,确认 cms_admin_log 表出现在列表中,字段类型与上面一致。
让CMS在关键操作时写入日志
以常见PHP类CMS为例,找到后台控制器入口文件,通常在 application/admin/controller/ 目录下。
在登录、新增、编辑、删除的公共方法中插入写日志逻辑:
$log = [
'admin_id' => session('admin_id'),
'admin_name' => session('admin_name'),
'action' => 'edit',
'module' => 'article',
'detail' => json_encode($params, JSON_UNESCAPED_UNICODE),
'ip' => request()->ip(),
];
db('cms_admin_log')->insert($log);
关键点:
action建议固定为login、add、edit、delete几类,方便后续筛选detail记录修改前后的关键字段,不要记录密码等敏感内容- 写日志代码放在业务操作成功之后,失败操作也建议记录,便于排查
验证方式:在后台修改一篇文章标题,刷新日志表,应看到一条 action=edit 的新记录。
日志查询与保留策略
日志写入后,还要能查、能清。
推荐在后台加一个日志列表页,按时间倒序展示,支持按管理员和操作类型筛选。
保留策略建议:
- 常规站点保留90天,安全要求高的保留180天以上
- 每天凌晨用计划任务清理过期日志,宝塔路径:
计划任务→添加任务→Shell脚本 - 清理命令示例:
DELETE FROM cms_admin_log WHERE created_at < DATE_SUB(NOW(), INTERVAL 90 DAY);
结论:日志只写不清理会拖慢数据库,定期归档比无限保留更稳妥。
常见坑位与排查
- 中文乱码:建表和连接字符集统一用
utf8mb4 - 日志没写入:检查写日志代码是否在
return之前,以及数据库账号是否有INSERT权限 - IP记录为
::1:这是本机IPv6回环,线上环境一般正常 - 日志表增长过快:检查是否把查询类操作也记了进去,查询不建议写入
- 后台删除管理员后日志查不到:日志表不要设外键级联删除,保留历史记录
效果验证清单
完成配置后,按下面清单逐项确认:
- 登录后台,日志表新增一条
action=login记录 - 新增一篇文章,日志表新增
action=add记录 - 删除一条数据,日志表保留删除记录且
detail可读 - 用不同管理员账号操作,
admin_name能正确区分 - 计划任务执行后,过期日志被清理
如果以上都能通过,说明CMS后台操作日志记录已经可以覆盖管理员所有操作,后续排查误操作或安全事件时就有据可查。
常见疑问
日志表放在CMS主库会不会影响性能?
中小流量站点通常没问题。
若写入频繁,可单独建日志库或改用文件日志,再定期导入分析。
能不能只记录删除操作?
可以,但不建议。
登录和修改同样重要,只记删除会丢失大量审计线索。
日志被管理员自己删了怎么办?
日志表权限应与CMS业务账号分离,后台不提供物理删除入口,清理只走计划任务。