Ruby 发生异常:未定义的方法`localtime'
Ruby exception occurred: undefined method `localtime'
我正在使用 logstash 2.1.3,我想在我的时区中显示 @timestamp 字段,例如“@timestamp”=>“2015-03-09T04:24:29.718+08:00”,我试试在过滤器中使用 ruby 转换。
filter
{
ruby {
code => "event['@timestamp'] =
event['@timestamp'].localtime('+08:00')"
}
}
但我收到如下错误消息,
Ruby exception occurred: undefined method `localtime' for "2016-04-29T00:40:51.926Z":LogStash::Timestamp {:level=>:error}
欢迎任何帮助来解决这个问题。
看起来您正在尝试对字符串调用 localtime
(event['@timestamp']
的结果,而应该在时间 object 上调用它。您将需要将该字符串解析为时间 object.
看看这个 irb session:
> 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
方法,我认为 returns 是 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 中的哪一个。
我正在使用 logstash 2.1.3,我想在我的时区中显示 @timestamp 字段,例如“@timestamp”=>“2015-03-09T04:24:29.718+08:00”,我试试在过滤器中使用 ruby 转换。
filter
{
ruby {
code => "event['@timestamp'] =
event['@timestamp'].localtime('+08:00')"
}
}
但我收到如下错误消息,
Ruby exception occurred: undefined method `localtime' for "2016-04-29T00:40:51.926Z":LogStash::Timestamp {:level=>:error}
欢迎任何帮助来解决这个问题。
看起来您正在尝试对字符串调用 localtime
(event['@timestamp']
的结果,而应该在时间 object 上调用它。您将需要将该字符串解析为时间 object.
看看这个 irb session:
> 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
方法,我认为 returns 是 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 中的哪一个。