作为一名通信码农,经常性分析大篇幅的log。久而久之,如何快速的在十兆百兆的文本log中理清问题发生的场景,问题的定位, 逐渐的有了一点心得,这篇文章分享出来,希望能交流经验。
我经验的核心是使用正则表达式:
1)用正则表达式代替简单关键词搜索
一般人会直接使用一个词汇在log中搜索, 比如找模块A, 可能就直接搜索 “moduleA”,这样找到的结果虽然只是跟你模块相关的,但是仍然是log量巨大的。对分析问题带来的好处还是有限。
我的做法是,首先你要对你负责的模块的流程比较清楚,比如启动过程有类似这样的log:
moduleA I‘m in status xx, send out event xxx
module A now status xxx, notify event xxx
那么就用正则表达式“moduleA.*event” 搜索。 可以检查启动流程是否正常, 不正常的, 异常发生在了哪一步骤。
2)同时搜索多个模块
接着上面的例子, 如果启动过程中, 怀疑moduleB 行为异常阻碍了moduleA的执行。一般的做法,是分两次搜索,一次搜索moduleA相关的, 一次搜索moduleB相关的。其实可以放在一起搜索:
假如moduleB有下面这样的log:
moduleB xxx run in step xxx
moduleB xxx run pass step xxx
我们可以用正则表达式“moduleA.*event|moduleB.*step” 来搜索, 这样你感兴趣的log就会放在一个搜索结果中。 对于分析两个模块之间的相互影响,时间关系等很有用。
3)如果log的场景是你陌生的, 但是大致确认了是你负责的模块有错误,你没有了固定的pattern 去搜索。这种情况我一般会尝试“moduleA.*err|moduleA.*fail”, err/fail 可以换上其他你经常遇到的表示异常的关键字, 经验上一般一半以上的概率也能找到问题发生的点:)
4) 最后说明一下: 我最长用的ultraedit 是支持上面的正则表达用法的。 虽然notepad++ 也支持,但是有个bug, 即,搜索结果常会有冗余条目,举个例子, log "moduleA in step xxx,notify moduleB", 如果我用正则搜索“moduleA|moduleB” ,上面这行log会在结果中显示两遍, 而ultraedit只显示一遍。
easylifesoso night of 2015, Jan, 8th