【问题标题】:How to group strings based on similarities in the string如何根据字符串中的相似性对字符串进行分组
【发布时间】:2021-02-03 05:44:17
【问题描述】:

我有一个 splunk 查询,它会按频率汇总错误

index="pc_1" LogLevel=ERROR 
   | eval Message=split(_raw,"|") 
   | stats count(LogLevel) as Frequency by Message 
   | sort -Frequency

这会产生表单中的结果

Message Frquency
No such user 137
unable to deliver mail to example@email.com: Unable to reach server 70
unable to deliver mail to example1@email.com: Unable to reach server 43
unable to authenticate user 3456 8
unable to deliver mail to example2@email.com: Unable to reach server 6
unable to authenticate user 2321 5
unable to authenticate user 13321 3
... .
... .
... .
unable to deliver mail to examplen@email.com: Unable to reach server 1

您可以在生成的结果中注意到,一些类似的错误正在根据用户电子邮件 ID 和机器 ID 的差异进行拆分。 我正在寻找一种方法可以根据字符串的相似性对其进行分组。目前我正在使用的是用常见的正则表达式替换字符串,然后找到频率

index="pc_1" LogLevel=ERROR 
   | eval Message=split(_raw,"|")

   | eval Message=replace("unable to deliver mail to (.)* Unable to reach server", "unable to deliver mail to [email]: Unable to reach server")
   | eval Message=replace("unable to authenticate user \d+", "unable to authenticate user [userId]")

   | stats count(LogLevel) as Frequency by Message 
   | sort -Frequency

这种方法可行,但相当麻烦,因为存在许多不同类型的错误,如果要实施此解决方案,则需要检查每个错误并为每个错误开发一个正则表达式。

有没有一种方法可以通过更有效地总结此错误的查询来改进?

【问题讨论】:

  • 您不需要这样做 - 您的日志应该存储原始模板字符串,而不仅仅是 格式化 消息字符串。
  • @Dai 我想要实现的是,在仪表板中,用户可以查看每种类型的错误发生的数量。只有分组看起来具有误导性,才会更改日志。如果 user1 遇到错误,而 user2 遇到相同的错误,则此错误应计入同一组
  • 对,这就是我的观点——但你不应该为此需要正则表达式。您应该能够简单地按原始模板字符串进行分组,这就是您需要做的全部(当然,在按-Frequency排序之前)
  • @Dai 这就是我想要找到的,有没有一种方法可以在不使用 RegExp 的情况下对其进行分组?
  • 重要的是:您是在处理渲染日志还是在处理结构化日志?

标签: regex splunk splunk-formula


【解决方案1】:

后人回答:

也许cluster 命令会有所帮助。它将喜欢的消息组合在一起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-27
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    • 2015-10-07
    相关资源
    最近更新 更多