elasticsearch Logstash无法索引到elasticsearch,因为它可以';t解析日期,elasticsearch,logstash,elasticsearch,Logstash" /> elasticsearch Logstash无法索引到elasticsearch,因为它可以';t解析日期,elasticsearch,logstash,elasticsearch,Logstash" />

elasticsearch Logstash无法索引到elasticsearch,因为它可以';t解析日期

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=>

当我运行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\""}}}}}
模板:

{
    "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"
  }
}