1

我想将一个值放入嵌套哈希的一部分,但根据上游过滤器命名该部分。这是为了重构和减少整体代码大小,因为目前 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 可行吗?

4

1 回答 1

2

事实证明,是的,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"
            }
        }
    }
}

我只是找不到任何不平凡的例子来做这样的事情。

于 2015-08-10T23:13:07.777 回答