我正在使用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}
欢迎任何帮助解决此问题。
答案 0 :(得分:1)
您似乎正在尝试在字符串上调用localtime
(event['@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中的哪一个。