使用document_id将logstash输出到elasticsearch; 当我没有document_id时该怎么办?

ted*_*r42 6 elasticsearch logstash logstash-configuration

我有一些logstash输入,我用它document_id来删除重复项.但是,大多数输入都没有document_id.以下是实际的document_id通过,但如果它不存在,它会被字面意思接受%{document_id},这意味着大多数文档被视为彼此的副本.这是我的输出块的样子:

output {
        elasticsearch_http {
            host => "127.0.0.1"
            document_id => "%{document_id}"
        }
}
Run Code Online (Sandbox Code Playgroud)

我以为我可以在输出中使用条件.它失败了,错误在代码下面给出.

output {
        elasticsearch_http {
            host => "127.0.0.1"
            if document_id {
                document_id => "%{document_id}"
            } 
        }
}

Error: Expected one of #, => at line 101, column 8 (byte 3103) after output {
        elasticsearch_http {
    host => "127.0.0.1"
    if 
Run Code Online (Sandbox Code Playgroud)

我尝试了一些"if"语句并且它们都失败了,这就是为什么我认为问题是在该块中有任何类型的条件.以下是我尝试的替代方案:

if document_id <> "" {
if [document_id] <> "" {
if [document_id] {
if "hello" <> "" {
Run Code Online (Sandbox Code Playgroud)

Mag*_*äck 9

你接近条件的想法,但你不能把它放在插件块中.改为:

output {
  if [document_id] {
    elasticsearch_http {
      host => "127.0.0.1"
      document_id => "%{document_id}"
    } 
  } else {
    elasticsearch_http {
      host => "127.0.0.1"
    } 
  }
}
Run Code Online (Sandbox Code Playgroud)

(但是使用uuid过滤器的其他一个答案中的建议也很好.)


Val*_*Val 5

解决此问题的一种方法是确保document_id始终可用.您可以通过在过滤器部分中添加UUID过滤器来实现此目的,document_id如果该字段不存在,则会创建该字段.

filter {
    if "" in [document_id] {
        uuid {
            target => "document_id"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

根据MagnusBäck的建议编辑.谢谢!