5

我正在尝试在 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)}`

非常感谢,尤里

4

1 回答 1

10

数学过滤器有一个出色的功能请求,但我目前不知道有任何此类功能。

同时,您可以使用ruby过滤器在您的事件上运行任意 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']"
}
于 2014-03-17T21:12:15.580 回答