介绍
在第一部分中,我解释了日志分析的理论方法,我认为这对维持工程师是最合适的。 这位工程师不需要在日志出现时立即对其进行分析,而是专注于对复杂问题的深入分析。 在第二部分中,我将展示一个复杂的模板可以涵盖许多搜索场景,并展示一个可行的原型。
搜索对象模板
搜索模板的主要要求是它必须是复杂的,在最佳情况下必须非常复杂。 手动搜索越少越好。 复杂的模板应完成大部分工作并快速完成。 由于我们这里没有任何服务器,因此仅预期可处理2-3 GB日志速度的开发人员PC也很重要。
主要正则表达式
模板应声明一些正则表达式,这些正则表达式将在日志中搜索(使用Matcher.find)。 如果首先声明多个,则收集第一个的结果,然后收集第二个的结果,等等。从最一般的意义上讲,搜索结果是String数组– List <String>。
验收标准
并非所有结果都被搜索过程接受。 例如,工程师可以搜索除“ X”以外的所有连接类型。 然后,他或她可以创建一个接受标准并过滤掉它们。 通过指定正则表达式“除X外的任何类型”。 另一种可能性是在时间间隔内搜索。 工程师可以搜索10到12个小时之间的任何日志记录(他或她必须输入完整的日期)。
寻找不同的表达也是可能的。 在这种情况下,工程师会指定一个以上的正则表达式(一般情况下会指定多个)。 一个例子将更好地解释这个概念。
不同的正则表达式:
connection type (q|w)
主正则表达式找到的日志记录:
connection type w found
connection type q created
connection type s destroyed
connection type q found
独特搜索的结果:
connection type w found
connection type q created
参量
正则表达式的问题之一是,真正有用的正则表达式非常长且笨拙。 以下是日志中的样本日期:
2018-08-06 10:32:12.234
这是它的正则表达式:
\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d.\d\d\d
解决方案非常简单–使用替代。 我称它们为正则表达式的参数。 有些参数可能像记录时间一样是静态的,但有些可以由用户定义。 在执行之前,立即将参数替换为实际值。
观看次数
搜索的结果是日志记录,即类似
2018-08-06 10:32:12.234 [Thread-1] DEBUG - Connection 1234 moved from state Q to state W \r?\n
虽然找到模板中定义的内容非常好,但最好将信息分成有用的部分。 例如,此表以简洁明了的方式表示该记录中的所有有用信息:
连接 | 1234 | 问 | -> | w ^ |
---|
要提取这些信息,我们可以使用“查看”方法。 这意味着声明在日志记录中搜索的较小的正则表达式,并返回一条有关日志记录的信息。 就像该日志记录的视图一样。 将所有内容显示在表格中将使其更易于阅读。 表也可以按任何列排序。
排序与合并
使用模板进行此类搜索的最有效方法是使用线程池,并将每个线程分配给日志文件。 假设池中有3-4个线程,则搜索将加快3-4倍。 但是合并结果成为一个重要的问题。 这里可以有2个解决方案:
- 合并结果 。 我们需要确保结果按正确的顺序排列。 如果我们有3个日志文件,第一个覆盖10-12个小时,第二个12-14,第三个14-17,则这些文件的搜索结果必须以相同的顺序进行。 这称为合并。
- 排序结果 。 除了合并它们,我们还可以按日期和时间对其进行排序。 不太复杂但简单。
合并看起来是一种更高级的技术,它使我们可以保留记录的原始顺序。
工作流程
最后的想法
在本文中达到这一点的每个人都必须困扰的问题是:是否有人试图实现所有这些? 答案是肯定的! 有一个基于Eclipse框架的工作应用程序,其中包括Spring XML配置和许多其他内容。 搜索对象模板的工作方式如本文所述。
这是Github链接:
https://github.com/xaltotungreat/regex-analyzer-0
为什么是0? 好吧,这本来应该是一个原型,但在某种程度上仍然是原型。 我称这个应用程序为REAL
[R egular
ËXpressions的
分析仪 对于L OGS
假定用户具有一些如何导出Eclipse RCP应用程序或如何从Eclipse IDE中启动它的知识。 不幸的是,我没有足够的时间来编写有关它的任何好的文档。 默认情况下,它可以分析HBase日志,并且config文件夹中有很多示例。
翻译自: https://www.javacodegeeks.com/2018/11/ide-approach-log-analysis-pt-2.html