我正在处理包含如下部分的日志文件:
538,486K of 1,048,576K
这些表示以可读格式呈现的内存使用(Java堆空间)。 我想在Kibana的图表中跟踪这些数字。 要做到这一点,我想以某种方式使用Logstash的grokfilter来parsing这些数字,但我不知道如何处理(即忽略)千位分隔符。
理想情况下,我会有一些也可以处理“K”和乘以一千的东西。 在这个时候,我不知道任何系统都以千字节为单位login,但我不想做这个假设。
mutatefilter允许使用gsub选项进行文本replace。
gsub需要一个数组,其中每个值的三元组表示:
它在技术上支持正则expression式,但是在这种情况下我们并不需要这个。
首先,我们删除逗号。 很简单。
其次,我们相乘。 K乘以1000? 如果是这样,在我看来,我们可以简单地用K取代K
把这些放在一起:
filter { mutate { gsub {[ "some_field", ",", "", "some_field", "K", "000" ]} } }
您可以根据需要添加其他replace选项。
根据你的情况, K可能乘以1024,这会更复杂一些。 我没有看到任何解决scheme,但你可以使用rubyfilter运行一些算术。
我认为路德的答案应该适用于我的情况。 以下是我在阅读之前最终做的事情:
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 " } } } }
我怀疑它可以更简洁,但它似乎工作。