【问题标题】:Logstash error when using if statement in pipeline在管道中使用 if 语句时出现 Logstash 错误
【发布时间】:2021-06-10 11:19:02
【问题描述】:

我正在尝试确定日志文件中是否存在某个字段,如果存在,则将该字段的值用作索引名称的一部分。如果该字段不存在,请使用不同的索引名称。

  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_append}" 或 index = "%{[@metadata ][beat]}")管道加载正常,但不考虑字段 'index_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 语句移至过滤器部分,但在 logstash 日志中收到相同的错误。我在其他管道中使用了类似的 if 语句并且没有遇到这些类型的问题。我将代码复制到 VS Code 并验证没有多余的空格或字符。我很茫然。

此管道在 Logstash 7.10.2 上运行

【问题讨论】:

    标签: elasticsearch yaml logstash elk


    【解决方案1】:

    将条件移至过滤器部分。使用 [@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。现已修复。
    猜你喜欢
    • 2018-12-28
    • 2017-08-23
    • 2012-11-05
    • 1970-01-01
    • 2015-05-06
    • 2011-08-14
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多