Logstash代理不再编制索引

时间:2015-09-02 13:42:31

标签: elasticsearch logstash

我有一个Logstash实例作为服务运行,从Redis读取并输出到Elasticsearch。我刚才注意到最近几天Elasticsearch没有什么新东西,但是Redis列表正在增加。

Logstash日志已经填满了数千行重复的2个错误:

:message=>"Got error to send bulk of actions"
:message=>"Failed to flush outgoing items"

原因是:

{"error":"IllegalArgumentException[Malformed action/metadata line [107], expected a simple value for field [_type] but found [START_ARRAY]]","status":500}, 

此外,尝试停止服务反复失败,我不得不杀死它。重新启动它会清空Redis列表并将所有内容导入Elasticsearch。现在似乎工作正常。

但我不知道如何防止这种情况再次发生。提到的type字段被设置为每个输入指令的字符串,因此我不理解它如何成为一个数组。
我错过了什么?

我正在使用Elasticsearch 1.7.1和Logstash 1.5.3。 logstash.conf文件如下所示:

input {
  redis {
    host => "127.0.0.1"
    port => 6381
    data_type => "list"
    key => "b2c-web"
    type => "b2c-web"
    codec => "json"
  }
  redis {
    host => "127.0.0.1"
    port => 6381
    data_type => "list"
    key => "b2c-web-staging"
    type => "b2c-web-staging"
    codec => "json"
  }

    /* other redis inputs, only key/type variations */
}
filter {
  grok {
    match => ["msg", "Cache hit %{WORD:query} in %{NUMBER:hit_total:int}ms. Network: %{NUMBER:hit_network:int} ms.     Deserialization %{NUMBER:hit_deserial:int}"]
    add_tag => ["cache_hit"]
    tag_on_failure => []
  }
  /* other groks, not related to type field */
}
output {
  elasticsearch {
    host => "[IP]"
    port => "9200"
    protocol=> "http"
    cluster => "logstash-prod-2"
  }
}

1 个答案:

答案 0 :(得分:1)

根据您的日志消息:

  

{“error”:“IllegalArgumentException [格式错误的操作/元数据行[107],预期字段[_type]的简单值,但找到[START_ARRAY]]”,“状态”:500},

您似乎正在尝试使用type字段索引文档,该字段是数组而不是字符串。

如果没有更多logstash.conf文件,我无法帮助您。 但请检查以下内容以确保:

  1. 当您使用add_field更改type时,实际上将type转换为具有多个值的array,这就是Elasticsearch所抱怨的。

  2. 您可以使用mutate join将数组转换为字符串:api link

    filter {
        mutate {
            join => { "fieldname" => "," }
        }
    }