Logstash添加一个Date类型的字段

tv6aics1  于 7个月前  发布在  Logstash
关注(0)|答案(2)|浏览(107)

我有一些包含以下格式的时间的日志:20231030 09:41:20.179021。我想在logstash中将这些日志解析为Date类型。
这是我目前的过滤器

filter{ 
  grok { 
    match => { 
      "message" => "%{YEAR:year}(?<month>\d{2})(?<day>\d{2}) %{TIME:log_time}"
    }
  }
  mutate {
    add_field => {
      "mytime" => "%{year}-%{month}-%{day}T%{log_time}Z"
    }
    remove_field => ["day", "month", "year", "log_time"]
  }
  date {
    match => ["mytime", "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZ", "ISO8601"]
    timezone => "UTC"
    target => "mytime" 
  }
}

字符串
但这似乎不起作用。虽然字段mytime被添加,但它的类型不是Date,而是Keyword
我做错了什么?

whlutmcx

whlutmcx1#

如前所述,如果您还没有创建Map,elasticsearch会创建一个Dynamic Mapping,并自动将它们作为关键字或其他类型进行索引。源代码如下:https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-mapping.html
如果您已经有了另一个Map,并且您创建了不适合当前索引的新文档,并且启用了动态Map,它仍然会动态Map它们。
你应该做的是创建一个Map,并告诉elasticsearch你想如何Map你的字段。这被称为显式Map。这里是源代码:https://www.elastic.co/guide/en/elasticsearch/reference/current/explicit-mapping.html
如果你只有一个索引并想Map它,你可以直接设置显式Map。
如果你有一个或多个类似的索引,并希望显式地Map它们,我建议使用索引模板

  • 您可以在Kibana中的Stack Management下找到它们,然后在左侧的Index Management部分找到它们。
  • 或者你可以使用Kibana Dev Tools或类似的Postman来发送你的模板。

如果您有一个现有的索引,并希望使用显式Map来Map它们,我建议使用索引,特别是如果您不想在旧索引中丢失数据。
在此版本中:

  • 为OLD_INDEX创建别名MYALIAS
  • 使用NEW_INDEX创建索引模板
  • 使用Kibana中的DEV TOOLS重新索引旧索引->新索引)
  • 现在你有两个指数。
  • 将MYALIAS设置为NEW_INDEX,就完成了。
z6psavjg

z6psavjg2#

在创建elasticsearch索引之前,您需要创建一个将应用于新索引的模板。

PUT _template/template_name
{
  "index_patterns": ["indices_name*"],
  "mappings" : {
      "dynamic_templates" : [
      ],
      "properties" : {
        "mytime" : {
          "format" : "the format",
          "type" : "date",
          "doc_values" : true
        }
      }
    }
}

字符串

相关问题