在 Elasticsearch 输出 ILM 翻转别名中使用变量

Bri*_*ian 5 elasticsearch logstash

我无法获得 ILM 翻转别名来接受变量。在这个特定的例子中,我们将有一个 ELK 集群托管多个环境的日志。日志条目将在进入 logstash 管道之前用其环境标记。我希望条目转到正确的别名,但是在启动 logstash 时出现以下错误(截断了堆栈跟踪):

一个意料之外的问题发生了!{:error=>java.net.URISyntaxException: 索引 0 处格式错误的转义对:%{[fields][Environment]}-logs

这是我的 logstash 管道:

input { 
  rabbitmq {
    host => "rabbitmq"
    port => 5672
    user => "guest"
    password => "guest"
    subscription_retry_interval_seconds => 5
    queue => "logstash-queue"
    exchange => "logs"
    exchange_type => "direct"
    durable => true
    key => "logstash"
  }
}

filter {
  mutate {
    rename => {"Properties" => "fields"}
  }
  mutate {
    lowercase => ["[fields][Environment]"]
  }
}

output {
  elasticsearch {
      hosts => ["http://elasticsearch:9200"]
      template_name=>"app-logs"
      ilm_enabled => true
      ilm_rollover_alias => "%{[fields][Environment]}-logs"
      ilm_pattern => "{now/d}-000001"
      ilm_policy => "30_day_retention_logs_policy"
    }
}
Run Code Online (Sandbox Code Playgroud)

sas*_*rsl 1

根据https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html#_writing_to_ Different_indices_best_practices

当 ilm_enabled 为 true 且使用 ilm_rollover_alias 时,不能使用动态变量替换。

建议的解决方案(在撰写本文时)是使用多个输出。我建议自动生成logstash.conf、salt、ansible 等,这样您就不必手动编辑配置文件。

output {
        if <condition> {
            elasticsearch {
                ...
                index => "logstash-<env>-logs"
                ilm...
            }
<etc>
Run Code Online (Sandbox Code Playgroud)

在弹性 github 上有关于此的问题 - 这种灵活性被删除了,这真的很奇怪,但你就这样了。