在grok logstash中进行EVAL

时间:2014-03-13 01:46:10

标签: variables math logstash eval logstash-grok

我试图在grok过滤器中添加新的字段,它应该是grok match命令提取的字段的算术表达式。

不幸的是,无法找出正确的语法......任何人?

我发现某个地方{(8*6)}应该返回48,但是变量而不是常量呢?

====
`if [type] == "f5" {
      grok {
        match => [ message, "...%{WORD:was_status}...%{NUMBER:hour}hr:%{NUMBER:min}min:%{NUMBER:sec}sec" ]
        add_field  => [ "duration_%{was_status}", "\{((%{hour} * 3600) + (%{min} * 60) + %{sec})}" ]
      }
    }`    
====

得到了结果,但EVAL显然无法正常工作:

message: ....   [ was down for 0hr:0min:4sec ]
duration_down   \`{((0 * 3600) + (0 * 60) + 4)}`

非常感谢,   由里

1 个答案:

答案 0 :(得分:10)

There is an outstanding feature request for a math filter,但我此时并未发现任何此类功能。

与此同时,您可以使用ruby filter在活动中运行任意Ruby代码。

这是一个简单的例子:

input {
    generator {
        count => 1
        message => "1 2 3"
    }
}

filter {
    grok {
        match => ["message", "%{NUMBER:a:int} %{NUMBER:b:int} %{NUMBER:c:int}"]
    }
    ruby {
        code => "event['sum'] = event['a'] + event['b'] + event['c']"
    }
}

output {
    stdout {
        codec => rubydebug{}
    }
}

请注意,grok通常会将值解析为字符串。如果我没有将它们转换为整数,Ruby会将+运算符作为字符串连接处理(并且sum最终会等于123)。

您的ruby过滤器看起来可能更像这样:

ruby {
    code => "event['duration_down'] = event['hour']*3600 + event['min']*60 + event['sec']"
}