我想将一个值放入嵌套哈希的一部分,但是根据上游过滤器命名该部分。这是为了重构和减少整体代码大小,因为目前20多个传入事件类型中的每一个都有自己的部分,在logstash文件中有18行(但目前%{detail_part}位是硬编码的)。
# Working code
filter {
if [result] == 0 {
# Success
mutate {
add_field => {
"[Thing][ThingDetail][OtherThing][MoreDetail]" => "true"
}
}
}
else {
# Failed
mutate {
add_field => {
"[Thing][ThingDetail][OtherThing][MoreDetail]" => "false"
}
}
}
}
以上是硬编码为" OtherThing"。下面有一个变量,但不起作用。
# Non-Working code
filter {
if [result] == 0 {
# Success
mutate {
add_field => {
"[Thing][ThingDetail][%{detail_part}][MoreDetail]" => "true"
}
}
}
else {
# Failed
mutate {
add_field => {
"[Thing][ThingDetail][%{detail_part}][MoreDetail]" => "false"
}
}
}
}
在上面的(非工作代码)中,detail_part在上游过滤器中设置为字符串值,如" OtherThing"。这个目前正在编译和运行,但是没有输出XML,所以我不认为这些语句会将任何内容设置到哈希值中。
我知道可以使用嵌入式Ruby代码完成,但我想要一种尽可能简单的方法。这个过程的输出是XML,因此我被限制使用这种嵌套哈希。
Logstash可以实现吗?
答案 0 :(得分:0)
事实证明,是的,Logstash支持这一点,只是语法错误。所以这是修复:
filter {
# This field could be set conditionally in an if statement ...
mutate { add_field => { "[detail_part]" => "Result" } }
if [result] == 0 {
# Success
mutate {
add_field => {
"[Thing][ThingDetail][%{[detail_part]}][MoreDetail]" => "true"
}
}
}
else {
# Failed
mutate {
add_field => {
"[Thing][ThingDetail][%{[detail_part]}][MoreDetail]" => "false"
}
}
}
}
我无法找到任何可以做到这一点的非平凡的例子。