如何记录可读性的操作日志?

前言 公司生产环境发生了一个事故,导致公司造成了损失。先说结果是因为业务人员修改参数时设置错了参数,导致事故发生。一开始业务人员认为是我们代码程序出了错误,好在有操作日志记录,于是前去查看发现,操作日志记录不全,没有记录到那个修改的参数。然后在排查代码发现没有问题之后,只能通过查找 MySQL 的 binlog 执行日志与 Nginx 的请求日志作为佐证,才将扣在身上的锅甩了出去。因此我意识到操作日志的重要性。 为什么要记录操作日志? 上文也已经说了,操作日志几乎存在于所有的系统中,尤其是后台管理系统,需要详细的记录下管理员所做出的操作,以便于更好的排查问题与溯源分析。 系统日志与操作日志的区别 系统日志 系统日志主要为了开发更好的排查问题,一般记录在日志文件中。系统日志一般是开发人员会进行查看,所以可读性不需要很高,甚至会包含一些代码信息。 操作日志 操作日志主要是为了记录使用人员的添加、修改、删除操作。一般是给用户看的,所以需要很高的可读性,能让人一眼就看明白操作了什么东西,而不需要再去结合代码进行分析。 常见的日志记录方式 自定义函数 在很多系统中都是定义了一个类似的admin_log()函数,然后在需要记录日志的地方调用这个函数传入记录的信息即可。 优点: 比较灵活,可以随意拼接自己想要记录的日志信息 在想要记录日志的地方只需调用函数就可以了 缺点: 日志的记录穿插在代码中,与代码耦合度很高,增加了代码复杂度 大块的日志信息在代码中看起来很丑 随着代码的修改可能还会需要对日志信息进行修改维护 有可能会忘记日志的记录,导致出了问题背锅 注解+ AOP 在 Java 中使用注解+ AOP 是一种很常见的日志记录方式,网上有很多这样的例子,但是在 PHP 中好像没有见过这种方式。 思考 我们现在的系统中就是使用第一种自定义函数的方式来记录操作日志的,有着很多的缺点,所以就想要寻求一种优雅的记录操作日志的方式。 在美团技术团队的《如何优雅的记录操作日志?》一文中很详细的描写了如何利用注解+AOP 实现操作日志的记录。而 PHP 也是有着注解和 AOP 的,看了这篇文章之后就一直思考该如何实现。想了很久,看了很多遍这篇文章还是感觉不是很完美,虽然把日志的记录从代码迁移到注解中与代码分离,但还是有很强的耦合,每次业务代码的修改还是需要对日志进行更新的。 想法 操作日志一般是需要记录下用户的增删改操作,对数据库增删改的操作我们一般使用 ORM 完成,所以我们可以使用 ORM 的模型事件created、updated、deleted来记录用户的增删改操作。 在其中我们可以很方便的获取到用户的操作内容,然后怎么实现可读性呢? 我的想法是通过获取表注释来明确这次操作的含义,然后通过字段注释知道操作字段的具体含义内容。如此我们就可以记录到可读性的日志内容了嘛? 实现 假如有张用户表,SQL 如下: create table tb_user ( id int auto_increment primary key, name varchar(20) null comment '姓名', sex tinyint default 0 null comment '性别' ) comment '用户'; 在其中添加一条数据:...

2022-01-04 · 1 分钟