【问题标题】:Logstash pipeline doesn't existLogstash 管道不存在
【发布时间】:2020-05-10 23:00:48
【问题描述】:

我从another question 开始处理这个问题。

我创建了如下管道。

{
    "bool-pipeline": {
        "description": "converts FALSE/TRUE to boolean",
        "processors": [
            {
                "convert": {
                    "field": "secure_flag",
                    "type": "boolean",
                    "ignore_missing": true
                }
            }
        ]
    }
}

我的有效值为 FALSE、TRUE、[Blanks]

我能够检索管道。

我在 Logstash 配置中添加如下。

 input {
    file {
        path => "/Users/gibbs/Documents/search/mini_system.csv"
        start_position => beginning
        sincedb_path => "/dev/null"
    }
}
filter {
    csv {
        columns => [
               "secure_flag",
               "mini_system_key",
               "hw_contract_end_date"
        ]
        separator => ","
        }
  mutate {
    remove_field => ["path", "host"]
  }
}
output {
    stdout {
        codec => rubydebug
    }
    elasticsearch {
        action => "index"
        hosts => ["127.0.0.1:9200"]
        index => "mini_system"
        document_id => "%{mini_system_key}"
        pipeline => "%{bool-pipeline}"
    }
}

但是当我加载数据时,它会抛出以下错误。

    [2020-05-10T16:13:05,691][DEBUG][o.e.a.b.T.BulkRequestModifier] [gopir-mac-1] failed to execute pipeline [_none] for document [mini_system/_doc/50395971|1038832]
java.lang.IllegalArgumentException: pipeline with id [%{bool-pipeline}] does not exist
    at org.elasticsearch.ingest.IngestService.executePipelines(IngestService.java:407) [elasticsearch-7.6.2.jar:7.6.2]
    at org.elasticsearch.ingest.IngestService.access$000(IngestService.java:75) [elasticsearch-7.6.2.jar:7.6.2]
    at org.elasticsearch.ingest.IngestService$3.doRun(IngestService.java:384) [elasticsearch-7.6.2.jar:7.6.2]
    at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:692) [elasticsearch-7.6.2.jar:7.6.2]
    at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) [elasticsearch-7.6.2.jar:7.6.2]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_231]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_231]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_231]

我一无所知。我现在正在尝试几个小时。

有什么建议吗?

当我检查日志时,我在弹性搜索日志中看到了该错误。 Logstash 有一个内衬。

【问题讨论】:

  • 在您所指的其他问题中查看我的评论 ;-) 只需使用 pipeline => "bool-pipeline" 而不进行字符串扩展
  • @Val 我经过努力解决了。 % 实际上误导了我
  • 很好,很高兴它有帮助!
  • @Val 我可以执行以下操作吗? if _source.secure_flag == %{FIELD} { pipeline => "bool-pipeline" } else if "partners" == %{FIELD} { pipeline => "partners-pipeline" } 不工作。
  • 我建议您创建一个新问题,因为您的初始需求已经得到解决。

标签: elasticsearch logstash


【解决方案1】:

您的摄取管道名称是bool-pipeline,您应该在elasticsearch 中使用它,而不是%{bool-pipeline}

%{FIELD} 用于与事件相关的值,这不是您的情况,使用%{bool-pipeline} 将使logstash 尝试从您的事件中名为bool-pipeline 的字段中提取具有摄取管道名称的值由于该字段不存在,您会收到此错误。

【讨论】:

  • 我还在努力理解第二段。如果可能的话,请帮忙。什么是事件,它与示例相关的价值是什么。
  • 事件是通过logstash管道的所有内容,日志文件中的每一行都是logstash的事件,例如,在你的情况下,字段mini_system_key可能对每一行都有不同的值您的 csv,并且您在 elasticsearch 中将此值用作 document_id,在 logstash 中访问字段值的方法是使用格式 %{FIELD},因为此字段的值取决于每个事件(日志行,例如例子)。您可以阅读更多内容documentation
  • 谢谢。这是一个很好的解释
  • 还有,我可以在 Logstash 的 ES 输出插件中指定多个管道吗?
  • @Gibbs 每个 ES 输出只能指定一个管道,但可以使用 if/else 逻辑指定多个 ES 输出
猜你喜欢
  • 2020-06-11
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多