【问题标题】:Parsing multiline stacktrace logstash解析多行堆栈跟踪 logstash
【发布时间】:2019-01-16 13:51:47
【问题描述】:

我正在尝试解析自定义日志消息,这些消息也有跨越多行的错误堆栈跟踪。如果我的 GROK 模式是多行堆栈跟踪并且我在 elasticsearc 索引中看到的只是消息的第一行,我的 GROK 模式无法解析。奇怪的是,如果我使用像 grokdebugger 这样的解析器来测试模式也适用于多行。我在 logstash 配置中缺少什么

以下是我在logstash中的grok模式的sn-p:

grok {match => [
        "message" , "%{TIMESTAMP_ISO8601:timestamp} \[%{SPACE}%{DATA:loglevel}\] %{DATA:class} \[%{DATA:operation}\] \(user=%{DATA:userid}\) (?m)%{GREEDYDATA:stacktrace}"
        ]
}

被解析的示例消息:

2018-01-09 21:38:21,414 [    INFO]  abc.xyz.def:444: [Put] [Protect] (user=xyz) Random Message

没有被解析的消息:

2018-01-09 21:38:21,415 [   ERROR]  abc.xyz.def:41: [Error] (user=xyz) Unhandled exception encountered...
Traceback (most recent call last):
  File "/usr/local/lib/abc/xyz.py", line 113, in some_requestrv = self.dispatch_request() 

【问题讨论】:

  • 您是否使用多行编解码器/在托运人级别加入行?
  • 没有。我正在使用 rsyslog 来发送日志。然后使用输入 tcp,然后是具有上述 grok 模式的过滤器,然后是 elasticsearch 的输出。

标签: elasticsearch logstash logstash-grok


【解决方案1】:

在您的情况下,您确实可以使用多行编解码器:

input {
  file {
    path => "/var/log/someapp.log"
    codec => multiline {
      # Grok pattern names are valid! :)
      pattern => "^%{TIMESTAMP_ISO8601} "
      negate => true
      what => "previous"
    }
  }
}

Here is the link for documentation

【讨论】:

  • 谢谢。这部分是否在 grok 过滤器之后进入?在我的情况下,我从 rsyslog 发送日志,然后在 logstash 中有一个带有 tcp 的输入,然后是一个带有 grok 的过滤器部分,然后是一个到 elasticsearch 的输出部分。
  • 在你的情况下,你必须在你的 tcp 输入中设置codec => multiline {...}
  • 是的,baudsp 的答案就是这样做的。如果这个答案对您有帮助,请不要忘记接受它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
相关资源
最近更新 更多