1

我有以下 logstash 配置文件,用于解析以下异常堆栈跟踪。

堆栈跟踪

2015-03-02 09:01:51,040 [com.test.MyClass] ERROR - execution resulted in Exception
com.test.core.MyException
    <exception line1>
    <exception line2>
2015-03-02 09:01:51,040 [com.test.MyClass] ERROR - Encountered Exception, terminating execution

配置文件:

input {
stdin {}
}

filter {
  multiline {
      pattern => "(^%{TIMESTAMP_ISO8601}) | (^.+Exception+) | (^.+Error+)"
      negate => true
      what => "previous"
    }
}

output {
stdout { codec => rubydebug }
}

我能够将堆栈跟踪解析为单个 logstash 字段名称消息。但是我想用第一个异常行的时间戳更新@timestamp ,即2015-03-02 09:01:51,040

目前它一直在为@timestamp使用默认时间戳

任何帮助将不胜感激。

4

1 回答 1

3

您需要使用GROK过滤器提取时间值,然后使用DATE过滤器将值解析为@timestamp

例如:

input {
        stdin {
                codec => multiline {
                        pattern => "(^%{TIMESTAMP_ISO8601}) | (^.+Exception+) | (^.+Error+)"
                        negate => true
                        what => "previous"
                }
        }
}

filter {

        grok {
                match => ["message" , "%{TIMESTAMP_ISO8601:logtime} %{GREEDYDATA:msg}"]
        }

        date {
                match => ["logtime", "YYYY-MM-dd HH:mm:ss,SSS"]
        }
}

output {
    stdout { codec => rubydebug }
}

此外,在输入中使用多行而不是在过滤器中,过滤器中的多行会将消息折叠到消息数组中,而不是单个消息字符串。所以,它会导致 grok 和 date 过滤器失败。

于 2015-03-04T01:47:31.483 回答