将日志消息时间戳转换为UTC,然后将其存储在Elasticsearch中

时间:2016-02-14 15:56:59

标签: elasticsearch logstash utc

我正在使用Logstash收集和解析Tomcat访问日志消息,并将解析的消息存储在Elasticsearch中。 我正在使用Kibana在Elasticsearch中显示日志消息。 目前我使用的是Elasticsearch 2.0.0,Logstash 2.0.0和Kibana 4.2.1。

访问日志行看起来如下所示:

02-08-2016 19:49:30.669 ip=11.22.333.444  status=200  tenant=908663983 user=0a4ac75477ed42cfb37dbc4e3f51b4d2 correlationId=RID-54082b02-4955-4ce9-866a-a92058297d81  request="GET /pwa/rest/908663983/rms/SampleDataDeployment HTTP/1.1" userType=Apache-HttpClient requestInfo=- duration=4 bytes=2548 thread=http-nio-8080-exec-5 service=rms itemType=SampleDataDeployment itemOperation=READ dataLayer=MongoDB incomingItemCnt=0 outgoingItemCnt=7 

日志文件中显示的时间(例如02-08-2016 19:49:30.669)是当地时间(不是UTC!)

以下是我解析消息行的方法:

filter {

        grok {
            match => { "message" => "%{DATESTAMP:logTimestamp}\s+" }
        }

        kv {}

        mutate {
            convert => { "duration" => "integer" }
            convert => { "bytes" => "integer" }
            convert => { "status" => "integer" }
            convert => { "incomingItemCnt" => "integer" }
            convert => { "outgoingItemCnt" => "integer" }

            gsub => [ "message", "\r", "" ]
        }

        grok {
            match => { "request" => [ "(?:%{WORD:method} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpVersion})?)" ] }
            overwrite => [ "request" ]  
        }

}

我希望Logstash将日志消息(' logTimestamp'字段)中读取的时间转换为UTC,然后再将其存储在Elasticsearch中。

有人可以帮助我吗?

-

我已将 date 过滤器添加到我的处理中,但我必须添加时区

    filter {
            grok {
                match => { "message" => "%{DATESTAMP:logTimestamp}\s+" }
            }

            date {
               match => [ "logTimestamp" , "mm-dd-yyyy HH:mm:ss.SSS" ]
               timezone => "Asia/Jerusalem"
               target => "logTimestamp"
            }

            ...
   }

有没有办法将日期转换为UTC而不提供本地时区,以便Logstash获取运行它的机器的时区?

这个问题背后的动机是我想在各个时区的所有部署中使用相同的配置文件。

2 个答案:

答案 0 :(得分:1)

这就是date {}过滤器的用途 - 解析包含日期字符串的字符串字段,将[@timestamp]字段替换为UTC中的该值。

答案 1 :(得分:0)

这也可以在摄取处理器中完成,如下所示:

PUT _ingest/pipeline/chage_local_time_to_iso
{
  "processors": [
    {
      "date" : {
        "field" : "my_time",
        "target_field": "my_time", 
        "formats" : ["dd/MM/yyyy HH:mm:ss"],
        "timezone" : "Europe/Madrid"
      }
    }
  ]
}

有关完整的分步说明,请参阅:https://alexmarquardt.com/2019/10/16/converting-local-time-to-iso-8601-time-in-elasticsearch/