elasticsearch 在管道中使用if语句时发生Logstash错误,elasticsearch,yaml,logstash,elk,elasticsearch,Yaml,Logstash,Elk" /> elasticsearch 在管道中使用if语句时发生Logstash错误,elasticsearch,yaml,logstash,elk,elasticsearch,Yaml,Logstash,Elk" />

elasticsearch 在管道中使用if语句时发生Logstash错误

elasticsearch 在管道中使用if语句时发生Logstash错误,elasticsearch,yaml,logstash,elk,elasticsearch,Yaml,Logstash,Elk,我试图确定日志文件中是否存在字段,如果存在,请将该字段的值用作索引名的一部分。如果该字段不存在,请使用其他索引名 beats { port => 5000 } } filter { } output { elasticsearch { hosts => ["https://elasticserver.io:9243"] user => "user" password => "pa

我试图确定日志文件中是否存在字段,如果存在,请将该字段的值用作索引名的一部分。如果该字段不存在,请使用其他索引名

  beats {
    port => 5000
  }
}
filter {
}
output {
  elasticsearch {
    hosts => ["https://elasticserver.io:9243"]
    user => "user"
    password => "pass"
    retry_on_conflict => "2"
    if [index_append] {
      index = "%{[@metadata][beat]}%{index_append}"
    }
    else {
      index = "%{[@metadata][beat]}"
    }
    "action" => "create"
  }
}
如果我删除输出部分中的If语句,并且只删除其中一个索引选项(index=“%{[@metadata][beat]}%{index\u append}”,或index=“%{[@metadata][beat]}”),管道将正常加载,但不会考虑字段“index\u append”是否存在

我尝试了很多组合,但是logstash日志似乎表明了某种语法问题

[2021-06-09T17:17:38,658][ERROR][logstash.agent           ] Failed to execute action {:id=>:"LogstashPipeline", :action_type=>LogStash::ConvergeResult::FailedAction, :message=>"Expected one of [ \\t\\r\\n], \"#\", \"=>\" at line 14, column 8 (byte 259) after output {\n  elasticsearch {\n    hosts => [\"https://elasticserver.io:9243\"]\n    user => \"user\"\n    password => \"pass\"\n    retry_on_conflict => \"2\"\n    if ", :backtrace=>["/opt/logstash/logstash-core/lib/logstash/compiler.rb:32:in `compile_imperative'", "org/logstash/execution/AbstractPipelineExt.java:184:in `initialize'", "org/logstash/execution/JavaBasePipelineExt.java:69:in `initialize'", "/opt/logstash/logstash-core/lib/logstash/pipeline_action/reload.rb:53:in `execute'", "/opt/logstash/logstash-core/lib/logstash/agent.rb:389:in `block in converge_state'"]}
我尝试将if语句移动到filter部分,但在logstash日志中收到相同的错误。我在其他管道中使用了类似的if语句,但没有出现此类问题。我将代码复制到VS代码中,并验证没有多余的空格或字符。我不知所措


此管道在Logstash 7.10.2上运行

将条件移动到筛选器部分。使用[@metadata]下的字段存储索引名。默认情况下,[@metadata]不会被输出写入,因此它对于存储临时变量非常有用

if [index_append] {
  mutate { add_field => { "[@metadata][index]" => "%{[@metadata][beat]}%{index_append}" } }
} else {
  mutate { add_field => { "[@metadata][index]" => "%{[@metadata][beat]}" } }
}
然后在输出中使用

index => "%{[@metadata][index]}"

成功了。但是,我不得不稍微修改一下else部分。很抱歉,我复制并粘贴了if部分,没有编辑else。现在修好了。