包含$的类名的Grok过滤器

时间:2017-02-14 14:00:23

标签: logstash elastic-stack logstash-grok

使用Grok过滤器时遇到问题。下面是我的过滤器,它正在按预期工作,而类名称中没有$。当线程名称类似于 PropertiesReader $ 时,它失败了。我还能使用什么,所以它可以用特殊字符解析类名?

filter {
      grok {  
           match => [ "message", "%{TIMESTAMP_ISO8601:LogDate} %{LOGLEVEL:loglevel} %{WORD:threadName}:%{NUMBER:ThreadID} - %{GREEDYDATA:Line}" ] 
      }
      json {
           source => "Line" 
      }
      mutate { 
            remove_field => [ "Line" ]  
      }  
}

3 个答案:

答案 0 :(得分:2)

您不限于grok模式名称。你可以做任何正则表达式。例如,您可以%{WORD:threadName}代替(?<threadName>[^:]+)来匹配任何不是:的字符,并将其分配给threadName

答案 1 :(得分:0)

您正在使用WORD作为您的threadname的模式,该模式不包含特殊字符。要确认这一点,请查看此模式:WORD \b\w+\b

使用自定义图案。只需在这样的文件中描述它:

MYPATTERN ([A-z]+\$?)

然后你可以在你的配置中使用它:

grok {
    patterns_dir => ["/path/to/pattern/dor"]
    match => [ "message", "%{TIMESTAMP_ISO8601:LogDate} %LOGLEVEL:loglevel} %{MYPATTERN:threadName}:%{NUMBER:ThreadID} - %GREEDYDATA:Line}" ] 
     }

您可以在docs

中找到有关自定义模式的更多信息

答案 2 :(得分:0)

如果您的threadName不包含空格或冒号,您也可以尝试使用public class Impl<B extends Inter, T extends Abs1<B>> extends Abs2<T> {...} 而不是%{DATA:threadName}