我有一个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"
}
}
答案 0 :(得分:1)
根据您的日志消息:
{“error”:“IllegalArgumentException [格式错误的操作/元数据行[107],预期字段[_type]的简单值,但找到[START_ARRAY]]”,“状态”:500},
您似乎正在尝试使用type
字段索引文档,该字段是数组而不是字符串。
如果没有更多logstash.conf
文件,我无法帮助您。
但请检查以下内容以确保:
当您使用add_field
更改type
时,实际上将type
转换为具有多个值的array
,这就是Elasticsearch所抱怨的。
您可以使用mutate join
将数组转换为字符串:api link
filter {
mutate {
join => { "fieldname" => "," }
}
}