将message日志中的字符串时间格式转化成@timestamp

半兽人 发表于: 2016-11-04   最后更新时间: 2016-11-04  
  •   0 订阅,1331 游览

采集日志的时候,由于有多个文件共同采集,时间顺序就不对了,所以要把@timestamp设置成日志中的时间。

我的日志格式如下:

[2016-11-01 16:48:24,946] [ERROR] c.b.t.x.x.x.x 200 -- [f8b9e646-363e-4976-ac83-944a99e159ac] failed transferFee EXCEPTION :c.b.t.manager.common.exception.FrontParamException: 错误码:BILLING_FAILED

增加grok,正则获取日志中的日期

filter{
    grok{
        match => {"message" => "\[(?<datetime>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2},\d{3})"}
    }
    date{
        match => ["datetime", "yyyy-MM-dd HH:mm:ss,SSS"]
        target => "@timestamp"
     }
}

执行测试:

bin/logstash -e 'input{
    stdin{}
}
filter{
    grok{
        match => {"message" => "\[(?<datetime>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2},\d{3})"}
    }
    date{
        match => ["datetime", "yyyy-MM-dd HH:mm:ss,SSS"]
        target => "@timestamp"
     }
}
output{
    stdout{codec=>rubydebug}
}'

输入上面我的日志格式,返回:

{
       "message" => "[2016-11-01 16:48:24,946] [ERROR] c.b.t.x.x.x.x 200 -- [f8b9e646-363e-4976-ac83-944a99e159ac] failed transferFee EXCEPTION :c.b.t.manager.common.exception.FrontParamException: 错误码:BILLING_FAILED",
      "@version" => "1",
    "@timestamp" => "2016-11-01T08:48:24.946Z",
          "host" => "linux21-49",
      "datetime" => "2016-11-01 16:48:24,946"
}

可以看到@timestamp已经修改成功了。

正则在线测试地址 grokdebug

http://grokdebug.herokuapp.com

@timestamp 比我们早了 8 个小时?

很多中国用户都有这个问题,那怎么修改成北京时间?

其实,Elasticsearch 内部,对时间类型字段,是统一采用 UTC 时间,存成 long 长整形数据的!对日志统一采用 UTC 时间存储,是国际安全/运维界的一个通识——欧美公司的服务器普遍广泛分布在多个时区里——不像中国,地域横跨五个时区却只用北京时间。

对于页面查看,ELK 的解决方案是在 Kibana 上,读取浏览器的当前时区,然后在页面上转换时间内容的显示。

所以,建议大家接受这种设定。否则,即便你用 .getLocalTime 修改,也还要面临在 Kibana 上反过去修改,以及 Elasticsearch 原有的 ["now-1h" TO "now"] 这种方便的搜索语句无法正常使用的尴尬。

以上,请读者自行斟酌。

移除

最后,这个datetime在elasticsearch没用,在filter中移除掉。

mutate {
        remove => ["datetime"]
  }






发表于: 1年前   最后更新时间: 1年前   游览量:1331
上一条: PowerMock介绍及用法
下一条: Zookeeper升级新版本步骤
评论…

  • 评论…
    • in this conversation
      提问