【问题标题】:logstash/elasticsearch failed to parse date field tried both date format [dateOptionalTime], and timestamp number with localelogstash/elasticsearch 无法解析日期字段尝试了日期格式 [dateOptionalTime] 和带有语言环境的时间戳编号
【发布时间】:2016-04-26 13:55:17
【问题描述】:

由于某种原因,logstash(1.5 版)无法处理带有此异常的日志:

{:timestamp=>"2016-04-26T09:20:12.141000-0400", :message=>"从字段解析日期失败", :field=>"时间", :value=>" 2016-04-26T09:20:03.520-04:00”,:exception=>java.lang.IllegalArgumentException:无效格式:“2016-04-26T09:20:03.520-04:00”在“T09:20”格式错误:03.520-04:00", :level=>:warn}

我在 json 中的时间字段是:

"time":"25-04-2016 04:21:06.786"

我的logstash配置是:

filter {

if [type] == "json" {
   json {
        source => "message"
        }
    date {
      match => [ "time", "dd-MM-yyyy HH:mm:ss", "dd-MM-yyyy HH:mm:ss:SSS", "dd-MM-yyyy HH:mm:ss.SSS", "yyyy-MM-dd HH:mm:ss,SSS" ]
    }    
     }
}

在 Elasticsearch 方面,我看到了这个异常:

解析日期字段 [25-04-2016 04:48:14.305] 失败,尝试了日期格式 [dateOptionalTime] 和带区域设置的时间戳 [] java.lang.IllegalArgumentException:无效格式:“25-04-2016 04:48:14.305”在“16 04:48:14.305”格式错误

我该如何解决这个问题?

【问题讨论】:

  • 它实际上看起来您的时间字段没有被捕获并且时间值是您的系统时间值,这就是它采用这种特定格式的原因。
  • 我认为你遇到了this 错误。

标签: elasticsearch indexing timestamp logstash


【解决方案1】:

我遇到了同样的问题; Logstash 会很高兴地完成它的工作,但是 Elasticsearch 会抱怨同样的错误。您可以看到使用正确的变量生成了“@timestamp”。关键是要理解这种错误是它说如下内容的地方:

[2020-07-22 12:27:40,814][DEBUG][action.bulk              ] [logs-p03] [logstash-2020.07.22][0] failed to execute bulk item (index) index {[logstash-2020.07.22][logs] ... org.elasticsearch.index.mapper.MapperParsingException: failed to parse [shibidp_timestamp]
...
Caused by: org.elasticsearch.index.mapper.MapperParsingException: failed to parse date field [20200722T002739Z], tried both date format [dateOptionalTime], and timestamp number with locale []
...
Caused by: java.lang.IllegalArgumentException: Invalid format: "20200722T002739Z" is malformed at "2739Z"

这表明映射很混乱......让我们看看:

GET http://127.0.0.1:9200/logstash-2020.07.22/_mapping
...
"shibidp_severity" : {
  "type" : "string",
  "index" : "not_analyzed",
  "fields" : {
    "raw" : {
      "type" : "string",
      "index" : "not_analyzed",
      "ignore_above" : 256
    }
  }
},
"shibidp_timestamp" : {
  "type" : "date",
  "format" : "dateOptionalTime"
},
...

我包含 shibidp_severity 只是为了展示大多数(字符串)是如何映射的。该模板不包含与 shibidp_timestamp 匹配的任何内容,或任何其他被映射为“日期”类型且格式为:“dateOptionalTime”的字段

映射到此的字段(查看 GET http://127.0.0.1:9200/logstash-2020.07.22/_mapping

  • @timestamp
  • 日期
  • shibidp_timestamp

这种行为似乎与动态日期检测有关

https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-field-mapping.html

https://www.elastic.co/guide/en/elasticsearch/reference/1.7/mapping-dynamic-mapping.html

在我的例子中,这种动态映射导致了一些竞争条件(遇到的第一个 'shibidp_timestamp' 值通知了当天索引的映射。让我们看看区别:

$ (d="2020.07.18"; curl -s http://127.0.0.1:9200/logstash-$d/_mapping | jq -c '.["logstash-'$d'"].mappings.logs.properties.shibidp_timestamp')
{"fields":{"raw":{"ignore_above":256,"index":"not_analyzed","type":"string"}},"index":"not_analyzed","type":"string"}

$ (d="2020.07.19"; curl -s http://127.0.0.1:9200/logstash-$d/_mapping | jq -c '.["logstash-'$d'"].mappings.logs.properties.shibidp_timestamp')
{"format":"dateOptionalTime","type":"date"}

这显示了 shibidp_timestamp 在两个不同的每日索引中的映射。前者是我们遇到看起来像字符串的东西时得到的;后者是当它看起来像时间戳时我们得到的东西(但无法解析为时间戳)

你可以做一些事情来解决这个问题:

  • 使用 logstash 从 logstash 发送的传入 JSON 中删除 shibidp_timestamp(如果您已经使用 logstash 'date' 插件将其转换为 @timestamp 字段,这可能很有用)。这将立即生效。
  • 更改映射(模板),使 shibidp_timestamp 显式映射到字符串,然后等待明天的索引开始(或删除今天的索引)
  • 将“basic_date_time_no_millis”(匹配 20200722T002739Z)添加到“默认”列表中。“dynamic_date_formats”列表(也适用于创建索引)https://www.elastic.co/guide/en/elasticsearch/reference/1.6/mapping-dynamic-mapping.html

【讨论】:

    【解决方案2】:

    您的@timestamp 具有偏移量(timzeone 值),您需要将其添加到您的配置中。请看这个链接:https://www.elastic.co/guide/en/logstash/current/plugins-filters-date.html

    • Z 时区偏移或标识
      • Z:时区偏移结构为 HHmm(与 Zulu/UTC 的小时和分钟偏移)。示例:-0700。
      • ZZ:时区偏移结构为 HH:mm(小时和分钟偏移之间的冒号)。示例:-07:00。
      • ZZZ:时区标识。示例:美国/洛杉矶。注意:Joda.org available time zones page 中列出了有效 ID。

    所以你的模式应该看起来很像:

    YYYY-MM-dd HH:mm:ss.SSSZ

    【讨论】:

    • 我认为当使用“日期”过滤器时,@timestamp 会被我的“时间”字段中的值覆盖,这不是问题吗?无论如何,我尝试使用你给我的模式,但我仍然看到同样的错误
    • @deezx 它被覆盖了,但是你必须指定正确的输入格式,这样它就不会抛出错误,这是你的情况。实际上,我误读了您的问题,我会尝试进行更多调查:|
    猜你喜欢
    • 1970-01-01
    • 2012-08-27
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    相关资源
    最近更新 更多