背景
代码总是难免会存在bug,对于如何定位bug方法有很多种,最常规的手段就是添加log日志,但是log日志也是一把双刃剑。
优点:
- log时机加的好,加的准确好,可以提前发现bug减少维护的工作量。
缺点:
- 加的时机不好,或者被滥用,一方面增加系统开销,另一方面对于定位问题也存在很大干扰,真正有效的log可能会被海量的无效重复log所淹没,导致定位问题好比是大海捞针。
如何维护好log日志,解决方法需要从多个角度:
- 需要增加代码提交时的code review
- 需要定义好log日志打印规则
- 通过case去反向审查log提高准确性
本文旨在通过脚本检测代码sct case log (System Compatibility Test case)
主要用于系统模块级别的测试)日志中的重复逻辑(比如N行以内的重复打印),并将检测结果存储到数据库. 通过网页UI界面展示, 方便进行数据查询和可视化, 并可以保存到Excel以便于后续分析和查询。
整体流程
先讲一下整体流程, 大致分为以下几个部分:
- 数据获取 -
sct log
读取 - 数据分析 - 提取重复
log
- 数据存储 - 构建数据库并存储
- 在线数据查询 - 网页UI查询
- 离线数据分析 - Excel 数据存储
目录结构
project/
│
├── repeated_log_check.py # 主函数脚本,包含重复代码检测逻辑
├── database_storage.py # 数据存储逻辑,支持灵活的参数调试和查询
├── database_query.py # 灵活数据查询接口定义,便于后续分析
├── ui_interface.py # 网页UI界面生成
├── templates
│ ├── index.html # 数据库查询参数输入
│ └── result.html # 数据库查询结果输出
└── README.md # 项目介绍文档
具体步骤
数据获取
主要目的是得到需要分析的数据的log日志文件路径的信息,如果本身这个不存在,那还需要自己运行下才能得到(这不是本文重点就不展开了),当前的数据来源都是基于某个定时运行的脚本生成的log日志(后期还可以通过历史版本比较,监控重复日志的产生和提醒)。
- 根据log日志目录结构,定位准确的log文件
- 根据文件大小和数量,选择文件读写的策略
数据分析
首先是对现有的log进行人工分析,为后续分析提供参考。
- 明确一个log日志文件所带有的信息,比如
case name
,为后续查询做准备 - 明确一条log日志的组成,比如时间戳,模块名,
log level
,log type
,log info
等,为重复分析做预处理 - 明确重复log的定义,定好重复log检测的策略
- 明确好存储的数据结构,为后续高效数据库存储和查询做准备
数据存储
主要是对于生成的数据采用什么数据库存储,采用什么存储策略,比如事务,批量存储,并发等等
- 基于当前的需求业务,挑选合适数据库
- 基于当前的数据类型,挑选合适的数据库存储方式
数据查询
主要目的是为了如果展示分析得到的数据。
首先是定义好数据库查询函数,如果从多角度展示,比如关注特定log level
的log,关注特定模块产生的log,关注特定流程产生的log等等。
然后是怎么展示,是使用命令行界面查询还是网页查询。
-
命令行界面:
优点:实现简单,扩展性强,透明程度高
缺点:操作复杂,对用户有更高要求,数据显示可能不会那么直观 -
网页查询:
优点:用户友好,可以实现黑盒查询,用户只要需要根据界面提示,就可以按照自己需求查询
缺点:实现复杂,对于查询的接口相对固化,要增加比较麻烦(主要是我完全不懂,不过有了cpoilot这个编程助手,功能实现似乎不是问题)
最后比较之后还是选择了网页查询,毕竟用户至上嘛,没有用户,功能也没有用武之地.
查询接口
提供数据查询接口, 当前设计了6种查询方式
single sct case
: 单个case存在多少重复log及其次数top sct cases
: 按照重复log的次数的case排名log type ranking
: log 类型有哪些及其次数排名top logs
: log总次数排名specific log
: 特定log在哪些case中存在及次数specific log type
: 特定某类log的次数排名
表格数据展示
把数据按照表格的形式显示出来, 提供多种形式排序.
可视化图表
有时候表格不一定直观, 增加课饼图作为补充显示.
excel 数据存储
提供一键excel格式导出功能, 检测结果存储到Excel表格中,便于后续分析和参考。
最后
下一篇讲实现细节: 与copilot 结对编程系列 - log日志重复性检测 - 第2篇 - 重复log检测框架解析
有兴趣, 需要源码可以关注我的公众号, 代码的更多细节, 一起交流~~~