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

How to format, yyyymmdd to yyyy-mm-dd in Logstash?

几周以来我就开始使用 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,因为我无法使用 "Date" grok 过滤器。或者有没有办法用上面的 yyyymmdd 日期格式过滤掉它?

编辑: 我特此附上我的自定义模式和 logstash conf.

的过滤器部分

我正在使用的模式:LOGTIMESTAMP %{YEAR}%{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 中的输出:

如有任何帮助,我们将不胜感激。

您可以使用 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 字段。