在 logstash 的字段中转义连字符

Escape hyphen in fields for logstash

logstash解析有问题,需要提取一个连字符分隔的字段:

if "[payload][text][code][session-id]" {
  mutate {
    add_field => { "session-id" => "%{[payload][text][code][session-id]}" }
  }
}

条件是有效的,因为引号,但是当我 运行 过滤器时,它 returns:

t session-id: %{[payload][text][code][session-id]}

我期望的是:

t session-id: HK5wfPQgzkKHmgzVF

我如何才能避开有效负载字段中的连字符?

您的条件是错误的,将字段名称放在双引号之间会使它成为一个字符串并且它将始终为真,因此您的 mutate 过滤器将始终 运行 并添加字段 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 { }
}

运行 此管道将为您提供值为 HK5wfPQgzkKHmgzVF 的字段 session-id,因为字段 [payload][text][code][session-id] 存在并且您的条件始终为真,如果您更改dissect 块中的字段名称 [payload][text][code][session-id-test] 和再次 运行 管道,session-id 的值现在将是 %{[payload][text][code][session-id]}.

从条件中删除双引号,只有字段 [payload][text][code][session-id] 确实存在时才会为真。