如何在Logstash中格式化yyyymmdd到yyyy-mm-dd?

时间:2016-08-23 10:17:05

标签: logstash logstash-grok elastic-stack logstash-configuration

我几周以来就开始使用ELK tool stack。我需要的是获取包含日期和时间的日志事件的timestamp并将其显示在不同的字段中(即:log_timestamp)。我试图提取DateStamp的所有可用选项,但没有任何效果。

这是我所拥有的日志文件的一行:

" 20160805 00:00:01.296,GetProvisioning,3,W1oOOW8oj58GhglVjVNg0Ssl4CXA1P,50219--1958335734-1470326399706,SUCCESS,GetProvisioningTransactionId-01223,null,W1oOOW8oj58GhglVjVNg0Ssl4CXA1P,en,CELCOM_MY_DCB "

我需要将日志事件的日期格式设置为yyyy-mm-dd,因为我无法使用"日期" grok过滤器。或者有没有办法可以使用上述yyyymmdd日期格式过滤掉它?

修改: 我特此附上我的自定义模式和logstash conf的过滤器部分。

我正在使用的模式: LOGTIMESTAMP%{年}%{MONTHNUM}%{MONTHDAY}

logstash conf中的过滤条件:

filter {

        grok {
            patterns_dir => ["/home/chamith/work/ELK/logstash/logstash-2.3.4/bin/patterns"]
            match => { "message" => "%{GREEDYDATA} %{LOGTIMESTAMP:logtimestamp}" }  

        }
        mutate {
            add_field => {
                "timestamp" => "%{LOGTIMESTAMP}"
            }
            remove_field => ["logtimestamp"]
        }
        date {
            match => ["logtimestamp", "yyyyMMdd HH:mm:ss"]
            target => "logtimestamp"
        }           
     }

和Kibana的输出:

enter image description here

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以使用date过滤器来解析时间戳。如果您想避免为grok编写自定义正则表达式,可以合并这两个字段并使用date过滤器。

对于你的特例:

grok {
    match => { "message" => "%{POSINT:time1} %{TIME:time2} ... <Rest goes here> }
}
mutate {
    add_field => {
        "timestamp" => "%{time1} %{time2}"
    }
    remove_field => ["time1", "time2"]
}
date {
    match => { "timestamp" => ""yyyyMMdd HH:mm:ss.SSS }
}

这几乎可以获得时间段并将其放在@timestamp字段中。