我有一台Elastic Stack
服务器(在 上Hyper-v
),它通过logstash
exec
命令提取数据并对其进行分析。除了日期字段显示为数字外,其他一切都运行良好。
我如何获得logstash
或识别字段Elasticsearch
为Kibana
日期而不是数字?
数据是以Unix epoch
时间为单位的milliseconds
。
代码:
文件输出的数据python
为JSON
格式。在达到 之前不会进行任何实际处理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"
}
}