如何在 Logstash 中解析人类可读的字节数?

如何在 Logstash 中解析人类可读的字节数?

我正在处理包含如下部分的日志文件:

538,486K of 1,048,576K

这些表示以人性化格式呈现的内存使用情况(Java 堆空间)。我想在 Kibana 的图表中跟踪这些数字。为此,我想以某种方式使用 Logstash 的 grok 过滤器来解析这些数字,但我不知道如何处理(即忽略)千位分隔符。

理想情况下,我会有一些东西可以处理“K”并乘以一千。目前,我不知道任何系统是否以千字节以外的单位记录,但我宁愿不做这样的假设。

答案1

mutate过滤器允许使用以下方式替换文本gsub选项。

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
        "
      }
    }
  }
}

我认为它可以变得更简洁,但它似乎有效。

相关内容