最近新功能提测上线,配合测试每天从早到晚的定位各种问题。
因为项目特殊,虽然测试点数量庞大,但是所有的问题定位的方式基本都大同小异。
测试不能及时提出问题,提测文档也总是晚一天或者几天发出来,所以定位起来也非常麻烦,加上项目的日志打印非常混乱,所以研究了一下快速定位的方式。
sed命令
sed是linux中提供的一个外部命令,它是一个行(流)编辑器,所以要注意一个问题,我们是在日志中通常是根据测试提供的日期时间进行定位。所以开始、结束时间必须是日志中存在的时间,如果不存在则查询不到。
sed -n '/2023-01-31 14:16:*/,/2023-01-31 14:17:*/p' DEBUG.log.2023-01-31
而根据业务,我实际是根据一分钟内的时间定位即可,配合正则表达式,所以实际使用到的命令是
sed -n '/2023-01-31 14:16:*/p' DEBUG.log.2023-01-31
>重定向命令
结合上面的sed命令,需要输出到一个单独文件中更好的进行定位,所以使用了>进行输出重定向到指定的日志文件中。
sed -n '/2023-01-31 14:16:*/p' DEBUG.log.2023-01-31 > ./log/outlog1.log
grep命令
截取出来的日志内容有DEBUG,INFO级别等等,还是不够清晰。所以使用grep进行过滤,直接定位类名更加清晰。
grep -rni "BOPJudge" ./log/outlog1.log > ./log/outlog2.log
less
最后查看截取出来,并且过滤好后的日志。这里没用cat view more vim...等等,而是使用了less,都说是linux正统查看文件内容的工具,功能极其强大,亲测也是如此,有很多文本编辑命令没有的功能。强烈推荐
less功能的参数很多,也很灵活,会单开一篇文章进行整理。
less -m -N ./log/outlog2.log
最终组合
上面的几个命令都为了方便起见,可以使用 ; 将命令行的命令组合在一起。更加便捷,拆解分析一下。
sed -n '/2023-01-31 14:16:*/p' DEBUG.log.2023-01-31
> ./log/outlog1.log ;
grep -rni "BOPJudge" ./log/outlog1.log
> ./log/outlog2.log ;
less -m -N ./log/outlog2.log
先使用sed截取指定日期时间,重定向到指定文件留存一份过程日志。
再使用grep进行关键词过滤,重定向结果到指定文件再留存一份日志。
最后使用less查看最终的日志。
最终命令就是如下这么长一串了。
sed -n '/2023-01-31 14:16:*/p' DEBUG.log.2023-01-31 > ./log/outlog1.log ; grep -rni "BOPJudge" ./log/outlog1.log > ./log/outlog2.log ; less -m -N ./log/outlog2.log