我在进行logstash解析时遇到问题,我需要提取一个由连字符分隔的字段:
if "[payload][text][code][session-id]" {
mutate {
add_field => { "session-id" => "%{[payload][text][code][session-id]}" }
}
}
该条件之所以有效,是因为引号,但是当我运行过滤器时,它返回:
t session-id: %{[payload][text][code][session-id]}
我期望的是:
t session-id: HK5wfPQgzkKHmgzVF
如何在有效载荷字段中放置连字符?
答案 0 :(得分:1)
您的条件是错误的,将字段名放在双引号之间将使其成为字符串,并且始终为真,因此您的session-id
过滤器将始终运行并在字段[payload][text][code][session-id]
中添加内容字段%{[payload][text][code][session-id]}
中的,如果该字段不存在,则字符串session-id
将作为字段的值添加到if [payload][text][code][session-id]
中。
您的条件应为input {
generator {
message => "HK5wfPQgzkKHmgzVF"
count => 1
}
}
filter {
dissect {
mapping => {
"message" => "%{[payload][text][code][session-id]}"
}
}
if "[payload][text][code][session-id]" {
mutate {
add_field => { "session-id" => "%{[payload][text][code][session-id]}"}
}
}
}
output {
stdout { }
}
,且不要使用双引号。
您可以通过以下测试管道来重现此行为
session-id
运行此管道将为您提供值为HK5wfPQgzkKHmgzVF
的字段[payload][text][code][session-id]
,因为如果将字段名称更改为{,则字段[payload][text][code][session-id-test]
存在并且您的条件始终为true dissect
块中的{1}}并再次运行管道,session-id
的值现在将为%{[payload][text][code][session-id]}
。
从条件中删除双引号,只有在字段[payload][text][code][session-id]
确实存在的情况下,它才会为真。