日期字段显示为整数

日期字段显示为整数

我有一台Elastic Stack服务器(在 上Hyper-v),它通过logstash exec命令提取数据并对其进行分析。除了日期字段显示为数字外,其他一切都运行良好。

我如何获得logstash或识别字段ElasticsearchKibana日期而不是数字?

数据是以Unix epoch时间为单位的milliseconds


代码:

文件输出的数据pythonJSON格式。在达到 之前不会进行任何实际处理elasticsearch

Logstash 配置:

input {
  exec {
    command => "/home/elliot/BullhornConnector.py JobOrder isOpen,webResponses,submissions,sendouts,interviews,placements,address,numOpenings,employmentType,owner,title,clientCorporation"
    interval => 60
    codec => json
    tags => ["JobOrder"]
  }
  exec {
    command => "/home/elliot/BullhornConnector.py Lead owner,leadSource,firstName,lastName,status,dateAdded"
    interval => 60
    codec => json
    tags => ["Lead"]
  }
  exec {
    command => "/home/elliot/BullhornConnector.py Opportunity owner,isOpen,dealValue,weightedDealValue,clientCorporation,status"
    interval => 60
    codec => json
    tags => ["Opportunity"]
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
  }
  stdout { codec => rubydebug }
}

屏幕截图:

以下是原始数据的截图: 原始数据显示

索引模式概览页面: 索引模式页面上的数据概览

该领域的详细视图: 设置不允许我更改它。

谢谢!

答案1

如果我正确阅读了 ElasticSearch 文档https://www.elastic.co/guide/en/elasticsearch/reference/current/date.html

JSON doesn’t have a date datatype, so dates in Elasticsearch can either be:

strings containing formatted dates, e.g. "2015-01-01" or "2015/01/01 12:10:30".
a long number representing milliseconds-since-the-epoch.
an integer representing seconds-since-the-epoch. 

因此,将 dateAdded 字段表示为“数字”数据类型是合乎逻辑的:Elasticsearch 只是将 JSON 数字转换为 ES 数字。

如果我查看自己的 ELK 实例,我发现“时间戳”字段表示为“日期”数据类型。这是由 logstash 自动完成的。

在后台,logstash 管理一个“映射模板”来定义 ES 字段数据类型。对于您的情况,它会简单地将日期类型从 JSON 转换为日期类型,而对于时间戳,它知道它是一个日期,因此明确定义它。

因此,您需要做的是定义一个映射模板,并使用 logstash 将其与数据一起推送到 ES。

ES 映射文档在此处https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html并且Logstash可以使用manage_template和elasticsearch输出中的模板来管理它https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html#plugins-outputs-elasticsearch-template. AS 映射简介https://www.elastic.co/blog/found-elasticsearch-mapping-introduction

您还可以查看实际正在使用的映射

curl -XGET 'localhost:9200/<index>/_mapping?pretty'

答案2

我在这里只是猜测,因为我不熟悉您谈论的平台和程序。但是,在您的屏幕截图中,您说您将数据类型更改为 Duration,但看起来数据类型仍然是“数字”,而“格式”是持续时间。如果我不得不继续猜测,我会说您的平台仍在尝试将您的字段序列化为数字,因为它的数据类型仍然是“数字”。将该类型更改为“日期”,如屏幕截图顶部的 @timestamp 字段,看看是否能解决问题。

答案3

我已经明白了:你需要做的是在 logstash 中使用过滤插件,特别是日期插入。

这是我添加到 logstash 配置中的代码片段:

filter {
  date {
    match => [ "dateAdded", "UNIX_MS" ]
    target => "dateAddedCorrected"
  }
}

相关内容