Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging ELK堆栈的Grok条件解析_Logging_Logstash_Kibana_Logstash Grok - Fatal编程技术网

Logging ELK堆栈的Grok条件解析

Logging ELK堆栈的Grok条件解析,logging,logstash,kibana,logstash-grok,Logging,Logstash,Kibana,Logstash Grok,我有这样的日志: 2020-09-02 14:29:22,854 [http-something] [ERROR] JavaClass(JavaLine) - [6652942]: Error message with no stack trace 2020-09-02 14:29:08,976 [http-something] [INFO] JavaClass(JavaLine) - [6791732]: Some message 2020-09-02 14:29:09,116 [http-s

我有这样的日志:

2020-09-02 14:29:22,854 [http-something] [ERROR] JavaClass(JavaLine) - [6652942]: Error message with no stack trace
2020-09-02 14:29:08,976 [http-something] [INFO] JavaClass(JavaLine) - [6791732]: Some message
2020-09-02 14:29:09,116 [http-something] [ERROR] JavaClass(JavaLine) - [6791732]: Error message with stack trace
JavaException: This is not going well
    at JavaClass
    at JavaClass
    at JavaClass
    at JavaClass
    at JavaClass
Caused by: JavaClass: This is a problem
    at JavaClass
    at JavaClass
    at JavaClass
    at JavaClass
    ... 48 more
我使用这个过滤器在Kibana上有一个更可读的日志:

filter {

    # INFO and ERROR
    grok {
        tag_on_failure => ["_stackTraceFailure"]
        match => { "message" => "%{TIMESTAMP_ISO8601:timestamp}%{SPACE}(\[%{DATA:thread}\])?%{SPACE}\[%{LOGLEVEL:log_level}\]%{SPACE}%{GREEDYDATA}%{SPACE}\-%{SPACE}%{GREEDYDATA:action}" }
        overwrite => [ "message" ]
    }

    # JAVA ERROR
    if ("_stackTraceFailure" in [tags]) {
        grok { 
            tag_on_failure => ["_grokParseFailure"]
            match => { "message" => "%{TIMESTAMP_ISO8601:timestamp}%{SPACE}(\[%{DATA:thread}\])?%{SPACE}\[%{LOGLEVEL:log_level}\]%{SPACE}%{GREEDYDATA}%{SPACE}\-%{SPACE}%{DATA:issue}(\r|\n)+(?m)%{GREEDYDATA:stack-trace}" }
            overwrite => [ "message" ]
            remove_tag => "_stackTraceFailure"
        }
    }
}
问题是第一个模式匹配所有内容,将所有堆栈跟踪(当存在堆栈跟踪时)放在action标记中,导致第二个模式永远不会使用。我知道这个问题是由GREEDYDATA引起的,但我对regex不是很熟练,我也没有找到解决方案来做我想做的事情


我不想交换模式的位置,因为信息和错误(没有堆栈跟踪)更常见,所以我需要一种方法使第一个在多行日志中失败,或者如果存在某种堆栈跟踪,则使第一个失败。从我到目前为止所做的事情开始,我能做些什么呢?

在开始之前,你需要使用条件句。您可以使用条件筛选整个消息并使用两个不同的
grok
过滤器,或者您可以将第一个
grok
过滤器保持不变,并使用条件仅解析
操作
字段,我建议使用第二个选项

在这两种情况下,您都需要根据只存在于多行消息中的内容进行条件筛选,在这种情况下可以是
“at JavaClass”
字符串

所以你需要这样的东西:

if "at JavaClass" not in [message] {
  grok { your first grok }
} else {
    grok { your second grok }
}
如果您想保留第一个grok,并使用第二个grok来只解析action字段,那么应该是这样的

if "at JavaClass" in [action] {
    grok {
        tag_on_failure => ["_grokParseFailure"]
        match => { "action" => "%{DATA:issue}(\r|\n)+(?m)%{GREEDYDATA:stack-trace}" }
    }
}

你没有说你是如何收集日志的,如果你使用filebeat或logstash,输入中编码了
multiline
,你也可以根据标记进行过滤,因为你的日志会有一个名为
multiline
的标记。

我使用filebeat收集具有多行模式的日志(
^[0-9]{4}-[0-9]{2}-[0-9]{2} 
)。当存在多行日志时,多行标记确实存在,因此我想我也可以使用它来让第一个标记在标记为真(或类似值)时失败。我将测试您的解决方案。