是否可以将日期从“2016-08-22T09:09:55.487Z”格式转换为Logstash中的UNIX时间?我看到了相反的操作,但没有看到它。
答案 0 :(得分:2)
首先,您必须使用日期过滤器将"2016-08-22T09:09:55.487Z"
转换为日期对象:
(假设字段date
包含表示有效ISO8601时间戳的字符串)
date {
match => ["date", "ISO8601"]
target => "date_object"
}
此时,您将拥有包含logstash时间戳的字段date_object
。
此时间戳可以转换为与to_i
方法等效的纪元
要做到这一点,我们必须使用ruby过滤器,它允许执行ruby代码作为过滤器。
ruby {
code => "event['date_epoch'] = event['date_object'].to_i"
}
然后你会有一个字段date_epoch
,它将是一个代表UNIX时间的数字。
答案 1 :(得分:2)
我今天遇到了类似的问题。不幸的是,上面的配置安静有一个限制,它在整数转换过程中从时间戳失去毫秒:
红宝石{
code => "事件[' date_epoch'] =事件[' date_object']。to_i"
}
我尝试了几个选项,包括将日期对象转换为浮点数,将其乘以1000然后再返回字符串。底线是精度不完全相同。
最后,我在下面提出了一些 hacky 示例。它与logstash版本2.4.1一起使用。
所以首先我创建一个字段tmpTimestamp
,以便将解析后的时间戳转换为普通的字符串:
mutate{
add_field => ["tmpTimestamp","%{@timestamp}"]
}
和平的ruby代码将字符串转换为标准的ruby DateTime格式,将其转换为epoch格式(包括ms),然后返回String:
ruby { code => "require 'date';event['epoch'] = DateTime.parse(event['tmpTimestamp']).strftime('%Q').to_s" }
删除未使用的tmp变量:
mutate{
remove_field => ["tmpTimestamp"]
}