【问题标题】:ELK: How to group stacktraces by exception class in KibanaELK:如何在 Kibana 中按异常类对堆栈跟踪进行分组
【发布时间】:2015-08-16 06:50:40
【问题描述】:

我正在为 Java Web 应用程序设置 ELK 堆栈。我用logstash成功解析了多行java堆栈跟踪,并在kibana中显示异常计数。现在我想显示一个日期直方图,其中包含按异常类分组的异常计数,即每分钟或每秒 2 个 java.lang.NullPointerException、3 个 java.lang.ArithmeticException。

在 kibana 中,我可以看到索引的完整堆栈跟踪。但是我无法按类可视化我的异常。这里的最佳做法是什么?尝试使用 Logstash 检索完全限定的类名并在 kibana 中进行术语过滤?或者有没有办法在kibana中使用ES的力量?

message 字段开头的示例:

2015-08-15 23:23:51.695 [qtp1010279661-1074] ERROR c.m.w.s.proxies.ProxyServlet:71 - Can't get content from url http://localhost:8080/...
org.apache.http.conn.HttpHostConnectException: Connect to localhost:8080 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1, localhost/fe80:0:0:0:0:0:0:1%1] failed: Connection refused
    at org.apache.http.impl.conn.HttpClientConnectionOperator.connect...

我的logstash配置:

input {
    file {
        path => "/Users/dbaq/web-app.log"
        start_position => beginning
    }
}

filter {
    multiline {
        pattern => "%{TIMESTAMP_ISO8601:timestamp}"
        negate => true
        what => "previous"
    }

    grok {
        match => ["message", "(?m)%{TIMESTAMP_ISO8601:timestamp} \[%{DATA:thread}\]\s*%{LOGLEVEL:severity}\s*%{DATA:class}:%{NUMBER:line:int}\s*\- %{GREEDYDATA:message}"]
        overwrite => [ "message" ]
    }

    date {
        match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss.SSS" ]
    }
}

output {
    elasticsearch {
        protocol => "http"
    }
    stdout {}
}

感谢您的帮助

编辑 1: 我的logstash 模式中的class 字段表示引发异常的类,在我的示例中为:c.m.w.s.proxies.ProxyServlet。我想按我的异常类聚合:org.apache.http.conn.HttpHostConnectException

【问题讨论】:

    标签: java logstash kibana-4 elastic-stack


    【解决方案1】:

    正如@Alain Collins 已经指出的那样,您可以使用“数据表”进行可视化。

    我建议您使用以下模式将多行编解码器添加到您的输入中:

    input {
        file {
             path => "/Users/dbaq/web-app.log"
             start_position => beginning
             codec => multiline {
                  pattern => "^\s"
                  what => "previous"
             }
        }
    }
    

    然后您可以通过执行以下操作使用预定义的 grok 正则表达式 JAVASTACKTRACEPART:

    if "multiline" in [tags] {
        grok {
            match => ["message", "%{JAVASTACKTRACEPART}"]
        }
    }
    

    请注意,这也会创建一个名为 class 的字段。您可以使用此字段执行术语搜索并将计数指标应用于它。

    【讨论】:

      【解决方案2】:

      “数据表”可视化类型应允许您聚合(“分组依据”)您的 class 字段并显示计数。

      编辑:哎呀,错误的字段。

      在您原来的 grok 中,您将行号后面的所有内容放回 message。要从此字符串中提取异常位置,您需要另一个 grok 节。

      模式的外观取决于错误消息的一致性。在您的示例中,它看起来像“连字符描述...位置冒号”。如果都是这样,你可以制作一个匹配的模式。

      【讨论】:

      • 不,我的class 字段表示引发异常的类,在我的示例中:c.m.w.s.proxies.ProxyServlet。我想按我的异常类聚合:org.apache.http.conn.HttpHostConnectException。如何将其提取以进行聚合?
      猜你喜欢
      • 1970-01-01
      • 2011-01-05
      • 2017-08-06
      • 2010-09-13
      • 1970-01-01
      • 2018-12-03
      • 2019-12-11
      • 1970-01-01
      相关资源
      最近更新 更多