我正在寻找一种非常简单的算法来从非常大的日志文件中滤除经常重复的行。 日志中条目的结构大部分是未知的。 (首先,我想处理systemd的journalctl的输出,但后来我也想将其用于其他日志...) 我剪切了条目的第一部分(包含时间戳和主机名),然后处理该行的其余部分。它可能包含许多可变字段,具有进程ID,另一个时间戳,序列号等,并带有常量字符串。 例如,我有很多这样的行:
anacron[29090]: Updated timestamp for job `cron.daily' to 2018-11-28
anacron[3330]: Updated timestamp for job `cron.daily' to 2018-11-29
anacron[6502]: Updated timestamp for job `cron.daily' to 2018-11-30
anacron[24515]: Updated timestamp for job `cron.daily' to 2018-12-01
anacron[12797]: Updated timestamp for job `cron.daily' to 2018-12-02
或这些:
whoopsie[1827]: [12:29:38] Cannot reach: https://daisy.ubuntu.com
whoopsie[1827]: [12:59:22] Cannot reach: https://daisy.ubuntu.com
whoopsie[1827]: [12:59:23] Cannot reach: https://daisy.ubuntu.com
whoopsie[1827]: [21:22:53] Cannot reach: https://daisy.ubuntu.com
whoopsie[2147]: [17:48:49] Cannot reach: https://daisy.ubuntu.com
whoopsie[2147]: [17:48:49] Cannot reach: https://daisy.ubuntu.com
whoopsie[2147]: [17:48:49] Cannot reach: https://daisy.ubuntu.com
(“很多”大于以后将根据日志文件的大小定义的值)
这是两组“相似”行。 如果我知道行的可变部分在哪里(第一个示例中的进程ID和日期字段,第二个示例中的pid和时间),这些变量可以过滤,但是我不知道所有可能的变化。消息来源对我来说是一个黑匣子。唯一可以确定的是,“固定”字段的数量大于变量。
我想找到它们(实际上我想从日志中过滤掉“噪音”),但是我不知道如何去做。我在寻找一种算法,而不是一种工具!
答案 0 :(得分:0)
该陈述是模棱两可的:相似性如何相似?输入和预期输出是什么?除非您能回答这些问题(最好是通过编辑问题),否则任何答案都将包含很多猜测。
让我们去追求低落的果实:
x N
乘数结束。现在进入实际算法:
可以通过一次实现:
start with an empty line
read a line
if different from previous line,
output previous line; and if found multiple times, its multiplicity
store it, with multiplicity 1
otherwise
increase multiplicity of saved line
需要一些更复杂的内容,但可以近似为O(N log N),例如:
sort all lines together (ignoring the time fields)
calculate distance between consecutive lines
find a threshold that gives you 90% of all lines grouped into, say, 10 groups
(you will want to fiddle with the % and group-count to find settings that
work for your application).
allow filtering out chosen categories
需要一个完整的日志分析应用程序,其中有很多。