1. 为什么要用正则表达式?
正则表达式提供了一套灵活便利的字符串匹配规则,可以说是文本处理领域的瑞士军刀,这里的文本处理当然也包括日志分析。
比如如果要过滤模块A(关键字“moduleA”)的所有错误、失败和异常,采用普通关键字过滤是下面这个流程:
使用关键字"moduleA"过滤出所有模块A的日志 -> 拷贝出结果,再使用关键字"error"过滤出模块A的所有错误 -> 基于第一份拷贝结果,再使用关键字"fail"过滤出模块A的所有错误 -> 基于第一份拷贝结果,再使用关键字"exception"过滤出模块A的所有异常。
很明显,这个流程效率非常低下,也间接导致了开发者对于日志分析,特别是复杂问题的日志分析,产生心理抵触。
而如果采用正则表达式,则是另一番场景:
使用正则表达式"moduleA&(error|fail|exception)"一次性得出所有结果。
简单明了!
2. 如何编写正则表达式
标准正则表达式完整教程可参考这里:正则表达式 – 语法 | 菜鸟教程
对于日志分析场景,常用的如下:
单个普通关键字 | word |
以“或”关系组合的多个关键字(注意|两边不要有空格) | word1|word2|word3 |
模糊匹配(其中.*代表匹配任意字符0次或多次) | hel.*rld |
部分工具也会提供自己的扩展正则,能够进一步提高效率,比如Tilipa的日志工具,它提供了如下扩展:
“非”逻辑(“!”), 比如查找所有异常,但不包含网络异常 | exception&!NetworkException |
“且”逻辑("&"), 比如查找模块A的错误 | moduleA&error |
3. 如何使用正则表达式
这个要看具体的工具,工具大体分为三类,一类是命令行工具,另一类是桌面工具,最后一类是web工具。
3.1. 先来说命令行工具
常用的日志分析命令行工具且支持正则表达式的有:vim、grep,这些工具即可单独使用,也可组合使用。
vim的使用如下:
首先通过“vim file”打开对应日志文件,其中file是文件路径指向你的日志文件。打开后按下"/", 然后输入正则表达式:
按下确定键后即可执行查找,如果找到多处,可通过按"n"键或者“N”键向前向后切换。
grep的使用格式为:grep -nE “word1|word2” file,其中“word1|word2”为你的正则表达式,file为文件路径。
命令行的优势是足够灵活,如果非常熟悉命令行,可以达到事半功倍的效果;不过,缺点也很明显,主要是两点,一是快速翻页浏览不方便,二是对于新手不友好。
3.2. 再来说桌面工具
支持正则表达式的桌面工具很多,常用的有notepad++、editplus、sublime等,甚至大多数的标准IDE也支持,可以直接使用。就体验来说,notepad++比较好,下面介绍notepad++的正则基本用法。
首先通过“文件->打开”打开日志文件:
然后通过“ctrl+f”打开搜索框,勾选“正则表达式”,输入关键字,点击“在当前文件中查找”即可:
搜索结果如下:
双击结果可以定位到具体的行。
3.3. 最后说下web工具
web工具最大的优势在于,几乎适用所有平台,而且轻量,即搜即用,即用即走,非常契合他的工具属性。已知的用于分析日志的web工具不多,比较有特色的一个是Tilipa日志工具(Tilipa-日志工具),它除了支持标准正则表达式以外,还提供了一些扩展能力,比如支持“且”逻辑和“非”逻辑,下面介绍它的基本用法。
首先通过“文件->打开”或者“alt+shift+o”打开日志文件:
然后通过“文件->过滤”或者“alt+shift+f”打开搜索框,勾选“扩展正则”,输入关键字:
确定后过滤结果如下:
下面贴出一些扩展正则的其他用法:
需要补充一句,Tilipa日志工具还支持超大日志文件,有需求的同学可以试试,体验还行。
4. 常用场景与对应正则表达式汇总
单个关键字过滤 | word |
以"或"关系过滤多个关键字 | word1|word2|word3 |
以“且”关系过滤多个关键字(用于过滤一个或多个模块的所有问题) | (module1|module2)&(error|fail|exception) |
去除干扰项 | word1&!discard |