运行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=>"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\""}}}}}
显然,日期形成有问题,但我不知道那可能是什么问题。以下是我的logstash配置和elasticsearch模板的摘录。我包括这些是因为我试图通过将timestamp
复制到timestamp
,然后将其格式化为@timestamp
格式,并使用存储的元数据来表达我的索引,从而使用YYY-MM-DD
字段来表达我的logstash配置中的索引
Logstash配置:
input {
stdin { type => stdin }
}
filter {
csv {
separator => " " # this is a tab (/t) not just whitespace
columns => ["timestamp","field1", "field2", ...]
convert => {
"timestamp" => "date_time"
...
}
}
}
filter {
date {
match => ["timestamp", "yyyy-MM-dd' 'HH:mm:ss'.'SSS'"]
target => "@timestamp"
}
}
filter {
date_formatter {
source => "@timestamp"
target => "[@metadata][date]"
pattern => "YYYY-MM-dd"
}
}
filter {
mutate {
remove_field => [
"@timestamp",
...
]
}
}
output {
amazon_es {
hosts =>
["my-es-cluster.us-east-1.es.amazonaws.com"]
index => "my-index-%{[@metadata][date]}"
template => "my-config.json"
template_name => "my-index-*"
region => "us-east-1"
}
}
模板:
{
"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
原来的问题是convert
块。 logstash无法理解文件中指定的时间格式。为了解决这个问题,我将原来的timestamp
字段更改为unformatted_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"
}
}
您正在使用csv
过滤器解析行并将分隔符设置为一个空格,但是您的日期也被一个空格分隔,因此,名为timestamp
的第一个字段仅获得日期2019-09-28
,而时间在名为field1
的字段上。
例如,您可以解决创建名为date_and_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_and_time
且值为2019-09-28 07:29:46.454
的字段,您现在可以使用date
过滤器将此值解析为@timestamp
字段,这是logstash的默认值。
date {
match => ["date_and_time", "YYYY-MM-dd HH:mm:ss.SSS"]
}
[这将为您提供两个具有相同值的字段date_and_time
和@timestamp
,@timestamp
是logstash的默认值,所以我建议保留它并删除之前创建的date_and_time
。
mutate {
remove_field => ["date_and_time"]
}
现在,您可以使用YYYY-MM-dd
格式创建基于日期的索引,logstash将从@timestamp
字段中提取日期,只需为此更改输出中的index
行:
index => "my-index-%{+YYYY-MM-dd}"