elasticsearch Logstash无法索引到elasticsearch,因为它可以';t解析日期
当我运行logstash将文档索引到Elasticsearch时,我遇到了很多以下错误elasticsearch Logstash无法索引到elasticsearch,因为它可以';t解析日期,elasticsearch,logstash,elasticsearch,Logstash,当我运行logstash将文档索引到Elasticsearch时,我遇到了很多以下错误 [2019-11-02T18:48:13,812][WARN ][logstash.outputs.elasticsearch] Could not index event to Elasticsearch. {:status=>400, :action=>["index", {:_id=>nil, :_index=>"my-index-2019-09-28", :_type=>
[2019-11-02T18:48:13,812][WARN ][logstash.outputs.elasticsearch] Could not index event to Elasticsearch. {:status=>400, :action=>["index", {:_id=>nil, :_index=>"my-index-2019-09-28", :_type=>"doc", :_routing=>nil}, #<LogStash::Event:0x729fc561>], :response=>{"index"=>{"_index"=>"my-index-2019-09-28", "_type"=>"doc", "_id"=>"BhlNLm4Ba4O_5bsE_PxF", "status"=>400, "error"=>{"type"=>"mapper_parsing_exception", "reason"=>"failed to parse field [timestamp] of type [date] in document with id 'BhlNLm4Ba4O_5bsE_PxF'", "caused_by"=>{"type"=>"illegal_argument_exception", "reason"=>"Invalid format: \"2019-09-28 23:32:10.586\" is malformed at \" 23:32:10.586\""}}}}}
模板:
{
"template" : "my-index-*",
"mappings" : {
"doc" : {
"dynamic" : "false",
"properties" : {
"timestamp" : {
"type" : "date"
}, ...
},
"settings" : {
"index" : {
"number_of_shards" : "12",
"number_of_replicas" : "0"
}
}
}
当我检查原始数据时,它看起来像是错误显示的内容,并且似乎格式良好,因此我不确定我的问题是什么
这是一个示例行,它已被编辑,但问题字段未被触及,是第一个
2019-09-28 07:29:46.454 NA 2019-09-28 07:29:00 someApp 62847957802 62847957802
您正在使用
csv
过滤器解析行,并将分隔符设置为空格,但您的日期也被空格分割,这样,您的第一个名为timestamp
的字段仅获取日期2019-09-28
,时间位于名为field1
的字段上
例如,您可以创建一个名为date\u和\u time
的新字段,其中包含日期和时间字段的内容
csv {
separator => " "
columns => ["date","time","field1","field2","field3","field4","field5","field6"]
}
mutate {
add_field => { "date_and_time" => "%{date} %{time}" }
}
mutate {
remove_field => ["date","time"]
}
这将创建一个名为date\u和
的字段,其值为2019-09-28 07:29:46.454
,您现在可以使用date
过滤器将该值解析到@timestamp
字段中,这是日志存储的默认值
date {
match => ["date_and_time", "YYYY-MM-dd HH:mm:ss.SSS"]
}
这将给您留下两个值相同的字段,date\u和\u time
和@timestamp
,@timestamp
是日志存储的默认值,因此我建议保留它并删除以前创建的date\u和\u time
mutate {
remove_field => ["date_and_time"]
}
现在,您可以使用格式YYYY-MM-dd
创建基于日期的索引,logstash将从@timestamp
字段中提取日期,只需更改输出中的索引
行即可:
index => "my-index-%{+YYYY-MM-dd}"
原来源问题是
convert
块。logstash无法理解文件中指定的时间格式。为了解决这个问题,我将原来的timestamp
字段更改为unformatted\u timestamp
,并应用我已经使用的日期格式化程序
filter {
date {
match => ["unformatted_timestamp", "yyyy-MM-dd' 'HH:mm:ss'.'SSS'"]
target => "timestamp"
}
}
filter {
date_formatter {
source => "timestamp"
target => "[@metadata][date]"
pattern => "YYYY-MM-dd"
}
}
共享您的数据样本,以便人们可以尝试复制您的管道。另外,删除
@timestamp
字段有什么特殊原因吗?如果不删除logstash,则可以使用其日期创建索引名。@leandrojmp添加了一个修订行以帮助重现问题。关于删除@timestamp
字段的问题,主要原因是我已经从我的文件中获取了它,不需要两个,所以删除它似乎是合乎逻辑的,末尾的单引号的目的是什么“
?@JesseC.Slicer我发现了一篇帖子,上面说应该是这样的,但我不记得在哪里了。我尝试了有和没有,但仍然得到错误unfortunately@JesseC.Slicer找到了那个职位。它用于非格式化语法。但我认为这不是问题所在,因为我正在使用它来创建元数据,而元数据似乎正在工作。由于原始值本身无法进入时间戳
字段,因此文件无法索引。我肯定会尝试这种方法,但鉴于错误“无效格式:\“2019-09-28 23:32:10.586\”在\“23:32:10.586\”
,我对此表示怀疑。看起来它实际上得到了整个日期和时间,但只是说格式不正确。所以忘了提到我的分隔符不仅仅是空白,它是一个选项卡,文件显示了这个特殊字符。我对这篇文章进行了编辑,使之更加清晰
filter {
date {
match => ["unformatted_timestamp", "yyyy-MM-dd' 'HH:mm:ss'.'SSS'"]
target => "timestamp"
}
}
filter {
date_formatter {
source => "timestamp"
target => "[@metadata][date]"
pattern => "YYYY-MM-dd"
}
}