【参考方案】缺少ELK的日志记录,你会怎么做?

276 阅读3分钟

情境引入

    单体项目中,由于客观条件(例如:项目紧急短时间内未搭建ELK日志系统等)导致需要再 MySQL 数据库中存储操作日志等相关数据;

操作日志 列表

image.png

针对上述操作日志列表,我们来进行操作日志列表的优化。

image.png

优化思路

(1)调整产品交互设计
  1. 默认筛选时间范围;(由于操作日志需要记录用户每一个再系统的操作行为,所以一天下来的操作记录肯定很多,建议 最多一周,也可以默认当日)
  2. 缩小默认筛选范围;(例如:① 时间范围缩小;② 其他业务类型默认非全部内容而是默认关键类型)
  3. 分页查询限制;(瀑布式弹性设计)
  4. 缩小最大当页条数限制; 禁止跳页操作,只允许上一页和下一页的翻看(总条目数可以通过异步拿到);
  5. 数据量比较大的字段,可以考虑不在列表中显示,使用【详情】按钮功能来查看;
  6. 列表中只显示几个比较重要的几个字段,无关竟要的数据量大的字段在列表显示既不合理也不适宜,反而在详情里面更合适;
  7. 数据定时清理 或 转移;
  8. 针对操作日志,我们可以根据产品设计成 一个月或一周前的操作日志进行归档或清理;(这样降低了数据库表的存储提高查询效率)
(2)数据库层面
  1. 建立索引;(数据库优化首先想到的,好的索引可以成倍的提高查询效率)
  2. 存储引擎调整;(MySQL数据库默认 InnoDB, 如果表只是用来做查询的操作建议调整为 MariDB)
  3. 数据存储分库分表分片或归档;
  4. 定时清理过往数据;(例如:清理6个月前的操作日志)
(3)系统架构方面
  1. 软件:
    1. 有条件做好是做 数据隔离 和 集中处理;(例如 设计日志系统,专门用来记录操作行为记录,常用的ELK、EFK等)
    2. 选用稳定高性能高安全等日志框架;
    3. ……
  2. 硬件:【略】
(4)程序优化方面
  1. 选用高性能的ORM框架;
    1. Mybatis 常用搭档 Mybatis Plus,支持 数据库再查询的时候支持查询指定的几个字段;
  2. 如果是 Java 语言,需要专注 JDK 版本所带来的性能提升;
    1. JDK8 就提供了 Lambda 表达式,支持 流式并行计算也是查询效率提升点;
  3. 代码开发规范;(这里面的内容设计比较多,例如:非空判断,筛选算法,排序算法,线程因素等等)
  4. 设置 操作日志记录开关
    1. 可以在 缓存组件(Redis)中给定一个永不过期的 key 作为开关,方便及时修改是否开始记录;
    2. 开关类型:
      1. 设置是否开启和关闭记录操作日志的开关;
      2. 设置是否记录 GET 请求的开关;(这个是由于GET请求是由于大量的请求导致的比如刷新页面可能会造成多个请求记录到日志系统或数据库)

附录

  • 实战经验持续总结