有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javaelk:如何在Kibana中按异常类对stacktrace进行分组

我正在为JavaWeb应用程序设置ELK堆栈。我成功地用logstash解析了多行java stacktraces,并在kibana中显示了异常计数。现在,我想显示一个日期柱状图,其中包含按异常类分组的异常计数,即2 java。lang.NullPointerException,3 java。lang.arithmetricException每分钟或每秒一次

在kibana中,我可以看到完整的stacktrace索引。但我无法将我的异常按类分组。这里的最佳实践是什么?尝试用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...

我的日志存储配置:

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: 我的日志存储模式中的class字段表示引发异常的类,在我的示例中:c.m.w.s.proxies.ProxyServlet。我想按我的异常类进行聚合:org.apache.http.conn.HttpHostConnectException


共 (2) 个答案

  1. # 1 楼答案

    “数据表”可视化类型应允许您聚合class字段并显示计数

    编辑:哦,错误的字段

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

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

  2. # 2 楼答案

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

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

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

    然后,您可以通过以下操作使用预定义的grok regex JAVASTACKTRACEPART:

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

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