【问题标题】:Ruby exception occurred: undefined method `localtime'发生 Ruby 异常:未定义的方法“localtime”
【发布时间】:2016-04-29 15:14:29
【问题描述】:

我正在使用 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}

欢迎任何帮助来解决这个问题。

【问题讨论】:

    标签: ruby logstash


    【解决方案1】:

    看起来您正在尝试在字符串上调用 localtimeevent['@timestamp'] 的结果,而应该在时间对象上调用它。您需要将该字符串解析为时间对象。

    查看这个 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 中的哪一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 2010-10-15
      相关资源
      最近更新 更多