我试图在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)}`
非常感谢, 由里
答案 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']"
}