分布式调试系列:关于日志的比对

 

有时候我们其实会遇到这种情况,本地修改了一点东西,然后发现跑跟预期结果不一致,这时候去看日志发现各种日志里面有各种ERROR,但是这些ERROR实际上并不是这个问题导致的,因为你回滚修改之后发现这些ERROR依然存在。如果有core文件当然最好,但是如果没有或者core里面并看不出问题就比较纠结了。前面一篇文章我们探讨了如何写个插件通过log来定位源码行,这篇日志我们讨论一下如何快速定位自己的错误日志。

首先,前面的状况至少可以保证一点,你check一份新的代码或者回滚本地修改然后运行,得到的错误日志和你当前的错误日志是可比较的。也就是说,你的错误至少不会导致错误日志之中有巨大的变化。这样的话我们可以采取如下的策略比较错误日志。

  1. 得到当前的错误日志,假使命名为log.core
  2. check一份新的代码或者回滚本地修改,得到之前的错误日志,假使命名为log.ok
  3. 比较log.ok和log.core,分析日志的差别,得到本地修改导致的真实错误日志。

想法是很简单的,唯一的问题是OB日志里面是有时间戳的,这就导致没一行都有差异,那就太纠结了。我们可以用如下vim命令来去掉所有的时间戳。vim正则的转义规则见参考文献

map :lg :%s/\(^\[.\{-}\]\)\\|\(\[\d\+\]\)\\|\(0x\w\+\)//g

这里面唯一的风险是比如我们在中括号里面写的数字也会被剔除,好在我们只是比较日志差异,想要看原始日志大不了根据行号到完整版里面找去,而且这个概率不大。

实际的效果是这样的。我在考虑要不要把所有的tsi错误都去掉。 tsi的错误可以直接剔除0x\w+这些16进制数。

参考文献:

[1] Vim 中的正则表达式, http://qianjigui.iteye.com/blog/368449

[2] Vim日志定位解决方案, http://cxh.me/2013/11/08/solution-to-locate-log-in-src/