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