在Logstash中将日期转换为UNIX时间

时间:2016-08-22 09:23:02

标签: logstash logstash-configuration

是否可以将日期从“2016-08-22T09:09:55.487Z”格式转换为Logstash中的UNIX时间?我看到了相反的操作,但没有看到它。

2 个答案:

答案 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"]
}