2012-04-13 70 views
2

在浏览日志文件时,我经常会一次又一次遇到相同的错误消息。当然,由于时间戳,用户名,IP地址等原因,两条线永远不会相同。日志文件的差异百分比

我正在寻找一种方法来设置“百分比差异”,并忽略与90%相似的任何行已经报告的错误消息。另一个想法是总是也忽略时间戳差异。

步骤:

  1. 用户输入搜索项(多个)(无论是正则表达式或简单文本),用于区别
  2. 用户输入公差
    [开始]
  3. grep的发现字符串匹配的搜索术语,并发送到新的文本文件
  4. Grep继续搜索日志,并找到相同的错误消息。差异可能是时间戳,日期和可能的用户名。由于该行至少有90%与新文件中的行相似,因此grep不会将其复制并继续搜索
  5. grep找到与搜索词匹配的新行。行相似度小于90%,因此它被复制到新文件并成为grep匹配未来结果的另一行。

*编辑:对不起,如果我第一次不清楚。如果需要,我会很乐意解释。

谢谢。

  • Log.1 - DD:MM:YYYY HH:MM:SS:MS错误 - 用户未能在IPADDRESS
  • Log.1登录 - DD:MM:YYYY HH:MM:SS:MS硬件开机
  • Log.2时失败 - DD:MM:YYYY HH:MM:SS:MS资源的捉襟见肘,警告 - 检查RAM
+1

那么,这里有什么问题? – zigdon 2012-04-13 19:20:39

+0

什么Perl函数或函数的组合可以让我识别文本行之间的百分比差异。 Grep找到一条错误消息并将其复制到新文件。 Grep找到相同的错误信息,但时间戳不同。由于错误消息至少有90%相似,因此忽略它并继续前进。重复,重复,重复。 – 2012-04-13 19:28:42

+0

@ r.misc:您应该编辑您的问题以添加更多信息并解释您想要的内容。 – Borodin 2012-04-13 19:31:08

回答

3

我不知道任何全失的机顶盒解决方案,但类似的算法可以帮助你想出一个通用字符串与另一个通用字符串的相似程度。

+0

这看起来和我正在寻找的东西非常相似,我只是担心它不够健壮。如果我不必下载额外的mod,这将是很好的。我如何实现与默认包类似的东西? – 2012-04-13 19:32:32

+0

你可以自己编写levenshtein算法。它不是非常复杂。请参阅维基百科artice:http://en.wikipedia.org/wiki/Levenshtein_distance – bot403 2012-04-13 22:04:03

+0

如果这是与比较文本行开箱即用的解决方案最接近的事情,我会接受。我不介意写一些额外的线路,以保持所有非第三方。 – 2012-04-16 21:11:02

2

另一个想法是使用时间戳缓存日志消息,因此您不会重复在最后一分钟内看到的消息。

my %msg_cache =(); 
sub log_filter { 
    my $msg = shift; 
    if (defined($msg_cache{$msg}) && $msg_cache{$msg} < time-60) { 
     # we've logged this message in the last minute - skip 
     return; 
    } 
    $msg_cache{$msg} = time; 
    return 1; 
} 
+0

这也是一个整洁的想法。我正在考虑的其他事情是,在每条独特的错误消息前后抓取3-5行。这样,我们可以看到可能导致信息的原因。 – 2012-04-13 20:54:12