mysql实现日志记录表的方式主要分为两种,一种是使用mysql内置的原生日志功能,另一种是创建自定义的业务日志记录表来存储特定场景的日志信息,两种方案适用的场景有所不同,开发者可以根据实际需求选择。

mysql内置日志类型及配置
mysql自身提供了多种内置日志,这些日志不需要额外创建表结构,由mysql服务自动维护,常见的内置日志包括以下几种:
错误日志
错误日志主要记录mysql服务启动、停止以及运行过程中出现的错误信息,默认是开启的,可以通过修改my.cnf配置文件调整相关参数:
# 错误日志文件路径 log_error = /var/log/mysql/error.log # 是否记录警告信息,1为记录 log_warnings = 1
二进制日志(binlog)
binlog记录所有对数据库进行更改的操作,主要用于主从复制和数据恢复,开启需要在配置文件中添加如下内容:
# 开启binlog log_bin = /var/log/mysql/mysql-bin # 日志格式,可选STATEMENT、ROW、MIXED binlog_format = ROW # 单个日志文件大小 max_binlog_size = 1024M
重做日志(redo log)和回滚日志(undo log)
redo log用于保证事务的持久性,记录数据页的物理修改;undo log用于事务回滚和MVCC,这两种日志由innodb存储引擎自动管理,不需要手动配置路径,只需要保证innodb引擎正常启用即可。
自定义业务日志记录表实现
如果内置日志无法满足业务需求,比如需要记录用户操作轨迹、接口调用记录等自定义内容,就可以创建专门的日志记录表,实现步骤如下:
表结构设计
自定义日志表需要根据业务需求设计字段,通常包含日志id、日志类型、操作内容、操作人、操作时间、关联业务id等字段,示例如下:
CREATE TABLE `sys_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日志ID', `log_type` varchar(20) NOT NULL COMMENT '日志类型:OPERATE-操作日志,LOGIN-登录日志,ERROR-错误日志', `content` text NOT NULL COMMENT '日志内容', `operator` varchar(50) DEFAULT NULL COMMENT '操作人', `operator_ip` varchar(50) DEFAULT NULL COMMENT '操作人IP', `biz_id` varchar(50) DEFAULT NULL COMMENT '关联业务ID', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), KEY `idx_log_type` (`log_type`), KEY `idx_create_time` (`create_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统日志记录表';
插入日志数据
表创建完成后,可以通过insert语句插入日志数据,通常可以在业务代码中封装日志插入的方法,避免重复编写插入逻辑:
-- 插入操作日志示例
INSERT INTO `sys_log` (`log_type`, `content`, `operator`, `operator_ip`, `biz_id`)
VALUES ('OPERATE', '用户修改了商品信息,商品ID:1001', 'admin', '192.168.0.1', '1001');
如果是使用java语言操作mysql,可以通过mybatis编写插入方法:
// 日志实体类
public class SysLog {
private Long id;
private String logType;
private String content;
private String operator;
private String operatorIp;
private String bizId;
private Date createTime;
// 省略getter和setter方法
}
// mapper接口方法
public interface SysLogMapper {
void insertSysLog(SysLog sysLog);
}
对应的mybatis xml映射文件内容如下:
<insert id="insertSysLog" parameterType="com.example.entity.SysLog">
INSERT INTO sys_log (log_type, content, operator, operator_ip, biz_id)
VALUES (#{logType}, #{content}, #{operator}, #{operatorIp}, #{bizId})
</insert>
两种方案的对比
为了帮助开发者选择合适的日志记录方案,下面是内置日志和自定义日志表的对比:
| 对比维度 | mysql内置日志 | 自定义日志表 |
|---|---|---|
| 维护成本 | 自动维护,无需手动操作 | 需要手动设计表结构,维护索引 |
| 适用场景 | 数据库服务运维、主从复制、数据恢复 | 业务操作记录、用户行为追踪、自定义审计 |
| 查询灵活性 | 需要通过特定工具解析,查询不便 | 支持标准SQL查询,可灵活筛选统计 |
| 存储位置 | 服务器磁盘文件 | mysql数据库表中 |
注意事项
- 自定义日志表的字段不要设计过多,避免插入日志时性能损耗过大,非必要字段可以设置为可选。
- 日志表的索引不要创建太多,通常给日志类型、创建时间等常用查询字段创建索引即可,过多的索引会影响插入效率。
- 如果日志数据量增长很快,可以定期归档历史日志数据,避免单表数据量过大影响查询性能。
- 敏感信息不要直接记录在日志表中,比如用户密码、身份证号等,避免信息泄露风险。