我的日志包含以下格式的时间:
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
类型。
我做错了什么?
在创建 Elasticsearch 索引之前,您需要创建一个将应用于新索引的模板。
PUT _template/template_name
{
"index_patterns": ["indices_name*"],
"mappings" : {
"dynamic_templates" : [
],
"properties" : {
"mytime" : {
"format" : "the format",
"type" : "date",
"doc_values" : true
}
}
}
}
如上所述,如果您尚未创建映射,elasticsearch 会创建一个 动态映射 并将它们自动索引为关键字或其他类型。 这是来源:https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-mapping.html
如果您已经有另一个映射,并且创建了不适合当前索引的新文档,并且启用了动态映射,它仍然会动态映射它们。
你应该做的是创建一个映射并告诉elasticsearch你想要如何映射你的字段。这称为“显式映射”。 这是来源:https://www.elastic.co/guide/en/elasticsearch/reference/current/explicit-mapping.html 如果你只有一个索引并想映射它,你可以直接设置显式映射。
如果您有 1 个或多个相似索引并希望显式映射它们,我建议使用
索引模板。
您可以在 Kibana 中的,特别是如果您不想丢失旧索引中的数据。 在此版本中:
为 OLD_INDEX 创建别名 MYALIAS