适合我输入的 grok 过滤器是什么?

What is the proper grok filter for my input?

我的输入如下:

"message" => "ERROR | [default task-55] my.package.className(Class.java:184) | - logstash-ERROR LOG\r",

我的 logstash 配置:

filter {
  grok {
    match => {"message" => "%{WORD:logLevel} | %{WORD:task} %{WORD:callfrom} | - %{WORD:logmessage}"}
  }
}

我的 log4j 配置 xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration xmlns="http://logging.apache.org/log4j/2.0/config">
    <Appenders>
        <File name="FILE" fileName="logfile.log" append="true">
            <PatternLayout pattern="%p | [%t] %l | - %m%n"/>
        </File>
        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout pattern="%p | [%t] %l | - %m%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="com.memorynotfound" level="debug"/>
        <Root level="info">
            <AppenderRef ref="STDOUT"/>
            <AppenderRef ref="FILE"/>
        </Root>
    </Loggers>
</Configuration>

在 kibana 中,我看到 logLevel 正常,我得到了正确的 loglevel,但换句话说我无法得到,我从过滤器中遗漏了什么? 感谢您的帮助!

更新

我试过这段代码:

^(%{WORD:logLevel}) (%{TASK_PATTERN:task}) (%{CLASS:callfrom}) (%{GREEDYDATA:logmessage})$

使用我的自定义模式:

TASK_PATTERN (^\[.*\]$)
CLASS .*\)

但它只找到日志级别

可能比这更具体,但根据 grokconstructor,以下工作:

%{WORD:level} \| \[%{WORD:task} %{NOTSPACE:callfrom}\] %{DATA:javaclass} \| - %{GREEDYDATA:message}

请记住,任何不匹配的字符,如 |[ 仍然需要在 grok 中说明。此外,these patterns 是一个很好的参考点,可以帮助您了解您可以免费做什么。