我正在处理包含如下部分的日志文件:
538,486K of 1,048,576K
这些表示以人性化格式呈现的内存使用情况(Java 堆空间)。我想在 Kibana 的图表中跟踪这些数字。为此,我想以某种方式使用 Logstash 的 grok 过滤器来解析这些数字,但我不知道如何处理(即忽略)千位分隔符。
理想情况下,我会有一些东西可以处理“K”并乘以一千。目前,我不知道任何系统是否以千字节以外的单位记录,但我宁愿不做这样的假设。
答案1
gsub
采用一个数组,其中每个三元组的值表示:
- 目标字段名称
- 搜索模式
- 替换模式
它在技术上支持正则表达式,但在这种情况下我们不需要它。
首先,我们去掉逗号。很简单。
其次,我们进行乘法运算。应该K
乘以 1000 吗?如果是这样,我认为我们可以简单地用K
替换000
。
把它们放在一起:
filter {
mutate {
gsub {[
"some_field", ",", "",
"some_field", "K", "000"
]}
}
}
您可以根据需要添加其他替换选项。
根据你的情况,K
可能会乘以 1024,这会有点复杂。我没有看到任何现成的解决方案,但你可以使用ruby
过滤器运行一些算术运算。
答案2
我认为 rutter 的答案应该对我有用。以下是我在阅读之前所做的:
filter {
grep {
match => { "message" => "...something identifying the message..." }
drop => false
add_tag => [ "MyMarker" ]
}
if "MyMarker" in [tags] {
grok {
match => [ "message", "...(?<rawCurValue>[0-9,]+)K of (?<rawMaxValue>[0-9,]+)K..." ]
break_on_match => false
}
if "_grokparsefailure" not in [tags] {
ruby {
code => "
if(event['rawCurValue'])
event['curValue'] = Integer(event['rawCurValue'].gsub(',','')) * 1000
end
if(event['rawMaxValue'])
event['maxValue'] = Integer(event['rawMaxValue'].gsub(',','')) * 1000
end
"
}
}
}
}
我认为它可以变得更简洁,但它似乎有效。