【问题标题】:Converting date to UNIX time in Logstash在 Logstash 中将日期转换为 UNIX 时间
【发布时间】:2016-08-22 09:23:01
【问题描述】:

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

【问题讨论】:

  • 当您询问 UNIX 时间时,您能指出预期的输出吗?你期望一个数字还是一个字符串?
  • @baudsp,我希望有这样的数字:1431607046

标签: logstash logstash-configuration


【解决方案1】:

首先,您必须使用日期过滤器将 "2016-08-22T09:09:55.487Z" 转换为日期对象:
(假设date字段包含一个表示有效ISO8601时间戳的字符串)

date {
    match => ["date", "ISO8601"]
    target => "date_object"
}

此时您将拥有一个字段date_object,其中包含一个logstash 时间戳。 可以使用to_i 方法将此时间戳转换为等效的纪元。
为此,我们必须使用 ruby​​ 过滤器,它允许将 ruby​​ 代码作为过滤器执行。

ruby {    
    code => set.event('date_epoch', event.get('date_object').to_i)"  
}          

然后您将有一个字段date_epoch,它将是一个代表 UNIX 时间的数字。

【讨论】:

    【解决方案2】:

    我今天遇到了类似的问题。不幸的是,上面的配置有一个限制,它在整数转换期间从时间戳丢失毫秒

    红宝石{
    代码 => "事件['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"]
    }
    

    【讨论】:

    • 对于一般的 Ruby 日期到纪元的转换也可以参考这个:stackoverflow.com/a/14733261/2695332 日期输入不必是整个时间戳。它可以是 MM/DD/YYYY 或 MM-DD-YYYY 等格式的日期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2020-12-23
    • 2016-04-24
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多