有效地解析具有部分的大量日志
Posted
技术标签:
【中文标题】有效地解析具有部分的大量日志【英文标题】:Parsing huge logs efficiently having sections 【发布时间】:2013-11-27 11:47:39 【问题描述】:我有 巨大的日志文件(在 gigs 中),它有一个标题(标记信息的开头),然后是信息。这是随机分布在整个文件中的(意味着一个标题后跟该信息可以出现在日志文件中的任何位置)。它也有一个父子层次结构。我需要根据为识别节/标题的开始模式而编写的正则表达式解析和处理此日志的信息,从而处理将遵循的信息。这里的问题是我必须匹配为所有编写的所有正则表达式日志文件的每一行的部分,以确定哪个部分被触发。 这种方法非常缓慢并且也遇到了问题,因为没有智能地了解日志中接下来会发生什么,并且当存在层次结构时它会放大。我想到了一种 的方法通过递归地将文件划分为块(分而治之)并将其分配给多个 actors(scala) 来索引文件,并且每一行可以与所有正则表达式并行匹配(代表开始部分)。我想知道这种方法的效率如何,并且希望有更多的输入来提高性能。这里的参考是日志文件可能出现的模式::
Section1
--------------
Info for section1
..
...
....
.
.
Section2
--------------
Info for section2
..
...
....
.
.
Section3
=================
Info for section3
Child1 of section3
--------------
Info for child of section3
Child2 of section3
----------------
Info for child of section3
Child1 of child2 which is child of section3
.........................
Info for child1 of child2 which is child of section3
Section1
-------------- //Section1 reappears
Info for section1
..
...
....
.
.
【问题讨论】:
【参考方案1】:您需要更改文件格式。我建议将其作为结构化数据存储在 RDBMS 或 MongoDB 中作为最简单的解决方案,但是如果您想使用自己的日志格式,则需要对其进行结构化,以便您知道每个块的开始和结束,以及 section/子编号是结构化的,因此您不需要使用正则表达式。
这是一种可能的解决方案。每个单独的块都是一个 JSON 对象,并存储在自己的行中。因此,您文件中的行可能如下所示:
"section": "1", "path": "/", "info": "Info for section1\nNext Line of info\nAnd so on..."
"section": "3", "path": "/child2/child1", "info": "Info for child1 of child2 which is child of section3"
【讨论】:
限制是它是一个原始日志并且不能重组它。此外,如果文件很大,那么读取并重新构建它,然后再次读取它以 process/mine 从中取出数据会使其变得非常慢。 我唯一的另一个想法是尝试将所有正则表达式概括为一个,例如Section(\d+)
。在当前系统中,什么标志着一个块的结束?只是一个新的开始?
它可以是一个新的开始,也可以定义结束正则表达式,但结束正则表达式是可选的,应该保留。以上是关于有效地解析具有部分的大量日志的主要内容,如果未能解决你的问题,请参考以下文章