我正在寻找一种非常简单的算法来从一个非常大的日志文件中过滤掉经常重复的行。日志中条目的结构大多是未知的。(首先我想处理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和时间),这些是可过滤的,但我不知道所有可能的变化。对我来说,来源是一个黑匣子。唯一可以确定的是,“固定”字段的数量大于变量。
我想找到它们(实际上我想从日志中过滤掉“噪音”),但我不知道该怎么做。我在找一个算法,而不是一个工具!
发布于 2018-12-12 18:28:08
这句话是模棱两可的:有多相似才是相似?输入和预期输出是什么?除非你能回答这些问题(理想情况下是通过编辑问题),否则任何答案都会包含大量的猜测。
让我们来看看容易摘到的果子:
乘法器N (>1) 连续行只有在很小的时间内不同,可以安全地压缩成1行,最后使用x N 乘法器。
现在来看实际的算法:
从空行开始读取一行,如果与前一行不同,则输出前一行;如果多次发现,则将其重数存储,否则增加保存的line
将所有行排序在一起(忽略时间字段)计算连续行之间的距离找到一个阈值,该阈值可以为您提供分组为10个组的所有行的90% (您可能希望调整%和group-count来查找适用于您的应用程序的设置)。允许筛选出所选的日志分析应用程序,其中有许多。
https://stackoverflow.com/questions/53738719
复制相似问题