elasticsearch - Filebeat 日期字段映射为类型关键字
问题描述
Filebeat 正在从文件中读取日志,其中日志格式如下:
{"logTimestamp":"2019-11-29T16:39:43.027Z","@version":"1","message":"Hello world","logger_name":"se.lolotron.App","thread_name":"thread-1","level":"INFO","level_value":40000,"application":"my-app"}
所以有一个字段logTimestamp以ISO 8601时间格式记录。问题是这个字段在Elasticsearch filebeat index中被映射为关键字
"logTimestamp": {
"type": "keyword",
"ignore_above": 1024
},
另一方面,如果我在同一个 Elasticsearch 实例中索引一个类似的文档,但索引不同,例如
POST /new_index/_doc/
{
"message": "hello world",
"logTimestamp":"2019-11-29T16:39:43.027Z"
}
映射是
"logTimestamp": {
"type": "date"
},
根据此处和此处的文档,默认情况下,如果使用strict_date_optional_time格式化,Elastic 应该会检测到日期。而 strict_date_optional_time 被描述为
一个通用的 ISO 日期时间解析器,其中日期是强制性的,时间是可选的。
我认为是 ISO 8601,并认为我在上面的示例中通过将新文档索引到 new_index 证明了这一点。
为什么在 Filebeat 的情况下 logTimestamp 保存为关键字?有任何想法吗?
我正在使用 Filbeat 7.2.1、Elasticsearch 7.2.1。还使用了默认的fields.yml。
解决方案
我刚刚发现默认情况下对filebeat索引禁用 date_detection(Filebeat 版本 7.2.1)。这可以在这里看到
var (
// Defaults used in the template
defaultDateDetection = false
...
看起来它不能被覆盖。
解决方法是使用实验性功能append_fields(至少在撰写本文时是实验性的。有关更多信息,请参见此处。)并将以下内容添加到 filebeat.yml 配置
setup.template.overwrite: true
setup.template.append_fields:
- name: logTimestamp
type: date
这将确保 logTimestamp 的映射是日期。
推荐阅读
- netsuite - 在 Netsuite 中如何使用 php 获取税表?
- javascript - Node jS express 验证 facebook API
- python - Django:在 HTML 表单提交上调用 views.py 中的函数
- python - 如何在主进程中获得信号以启动操作?
- proxy - 通过本地机器代理/隧道访问VPN
- algorithm - 如何找到完成 n 个作业的最少处理器数
- mysql - 如何在不使用预取概念的情况下从 mysql 反向外键获取数据?
- arrays - 将多个单元格的公式形成连接到一个单元格中
- django - pre_save 后保存模型会失败吗?
- teamcity - 是否可以使用不可用的 VCS 根运行 TeamCity 构建?