从日志中过滤掉相似的行

时间:2018-12-12 08:16:54

标签: algorithm text filtering

我正在寻找一种非常简单的算法来从非常大的日志文件中滤除经常重复的行。 日志中条目的结构大部分是未知的。 (首先,我想处理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和时间),这些变量可以过滤,但是我不知道所有可能的变化。消息来源对我来说是一个黑匣子。唯一可以确定的是,“固定”字段的数量大于变量。

我想找到它们(实际上我想从日志中过滤掉“噪音”),但是我不知道如何去做。我在寻找一种算法,而不是一种工具!

1 个答案:

答案 0 :(得分:0)

该陈述是模棱两可的:相似性如何相似?输入和预期输出是什么?除非您能回答这些问题(最好是通过编辑问题),否则任何答案都将包含很多猜测。

让我们去追求低落的果实:

    可以将
  1. N(> 1)个连续行(仅在少量时间内出现差异)安全地浓缩为1行,并在 x N乘数结束。
  2. 线的来源可能非常有限(可能少于100条)。每个源的不同消息的数量也受到限制:守护程序通常会报告例如启动,操作结束以及一些非常偶然的杂项消息。您要标识最重要的消息源和最重要的每个源消息,以按需切换
  3. 过滤大量日志消息有点类似于过滤网络上的流量转储。网络人员如何理解这一点? 执行wireshark&co的操作:要理解大量异构数据,可以进行交互式查询和过滤。一键式命令行工具将使您大失所望。

现在进入实际算法:

  1. 可以通过一次实现:

     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
    
  2. 需要一些更复杂的内容,但可以近似为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
    
  3. 需要一个完整的日志分析应用程序,其中有很多。