【发布时间】: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