Ruby异常发生:未定义的方法`localtime'

时间:2016-04-29 00:50:01

标签: ruby logstash

我正在使用logstash 2.1.3,我想在我的时区中显示@timestamp字段,例如“@timestamp”=> “2015-03-09T04:24:29.718 + 08:00”,我尝试在过滤器中使用红宝石转换。

filter 
  {

     ruby {

       code => "event['@timestamp'] =  
            event['@timestamp'].localtime('+08:00')"

    }

}

但是我得到了错误消息,如下所示,

  

发生了Ruby异常:“2016-04-29T00:40:51.926Z”的未定义方法`localtime':LogStash :: Timestamp {:level =>:error}

欢迎任何帮助解决此问题。

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试在字符串上调用localtimeevent['@timestamp']的结果,而应该在Time对象上调用它。您需要将该String解析为Time对象。

查看此irb会话:

> require 'date'
true
> fmt = '%Y-%m-%dT%H:%M:%S.%L%z'
"%Y-%m-%dT%H:%M:%S.%L%z"
> s = "2016-04-29T00:40:51.926Z"
"2016-04-29T00:40:51.926Z"
> localtime_as_string = DateTime.strptime(s,fmt).to_time.localtime('+08:00').strftime(fmt)
"2016-04-29T08:40:51.926+0800"

在您的情况下,您可以使用:

require 'date'
fmt = '%Y-%m-%dT%H:%M:%S.%L%z'
s = event['@timestamp'].to_s
tz = '+08:00'
event['@timestamp'] =  DateTime.strptime(s, fmt).to_time.localtime(tz).strftime(fmt)

进一步检查时,从event['@timestamp']这样的输出中查找包含Logstash :: Timestamp的实例。我查看了该API(https://github.com/elastic/logstash/blob/master/logstash-core-event/lib/logstash/timestamp.rb),看起来有一个可公开访问的time方法,我假设它返回Time的实例。如果是这种情况,那么上述情况将不起作用,但这可能是:

require 'date'
# For fmt you may also be able to use Logstash::Timestamp::ISO8601_STRFTIME
fmt = '%Y-%m-%dT%H:%M:%S.%L%z'
time = event['@timestamp'].time
tz = '+08:00'
event['@timestamp'] = time.localtime(tz).strftime(fmt)

但是,您确定要替换event['@timestamp']吗?另一种方法是将其用于显示但不修改原始变量。这可能更安全,因为如果变量在其他地方使用,则不知道它是2中的哪一个。