Flume“OR Regex”过滤拦截器

时间:2015-04-04 21:45:09

标签: regex expression filtering interceptor flume

我是Flume的新手,我找不到关于正则表达式的足够信息 - 这就是我需要帮助的原因。

我正在尝试制作正则表达式过滤拦截器。

我有一些类似的事件:

[20151010][type1][stuff]
[20151011][type2][stuff]
[20151012][type3][stuff]
[20151013][type4][stuff]
[20151014][type1][stuff]
[20151015][type2][stuff]
[20151016][type3][stuff]

我想制作一个包含type1和type2的正则表达式过滤器。

结果应为:

[20151010][type1][stuff]
[20151011][type2][stuff]
[20151014][type1][stuff]
[20151015][type2][stuff]

是否可以只制作1个过滤器? 或者我应该多路复用信息并制作两个不同的过滤器?

2 个答案:

答案 0 :(得分:0)

使用RegexInterceptor,可以使用OR运算符过滤事件,如下所示

 agent.sources.source_3.interceptors.filters.type = regex_filter                                    
 agent.sources.source_3.interceptors.filters.regex = .*type1.*|.*type2.*                    
 agent.sources.source_3.interceptors.filters.excludeEvents = false

顺便说一句,这就是正则表达式在scala / java中的作用,例如

模式

scala> import java.util.regex.Pattern;
import java.util.regex.Pattern

scala> import java.util.regex.Matcher;
import java.util.regex.Matcher

scala> val pattern = Pattern.compile(".*type1.*|.*type2.*")
pattern: java.util.regex.Pattern = .*type1.*|.*type2.*

matcher 1

scala> val matcher = pattern.matcher("[20151010][type1][stuff]")
matcher: java.util.regex.Matcher = java.util.regex.Matcher[pattern=.*type1.*|.*type2.* region=0,24 lastmatch=]

scala> val matches = matcher.matches()
matches: Boolean = true

matcher 2

scala> val matcher = pattern.matcher("[20151011][type2][stuff]")
matcher: java.util.regex.Matcher = java.util.regex.Matcher[pattern=.*type1.*|.*type2.* region=0,24 lastmatch=]

scala> val matches = matcher.matches()
matches: Boolean = true

匹配3

scala> val matcher = pattern.matcher("[20151011][type3][stuff]")
matcher: java.util.regex.Matcher = java.util.regex.Matcher[pattern=.*type1.*|.*type2.* region=0,24 lastmatch=]

scala> val matches = matcher.matches()
matches: Boolean = false

如果您查看他们的implementation code,他们正在使用matcher.find()

scala> val pattern = Pattern.compile(".*type1.*|.*type2.*")
pattern: java.util.regex.Pattern = .*type1.*|.*type2.*

scala> val matcher = pattern.matcher("[20151010][type1][stuff]")
matcher: java.util.regex.Matcher = java.util.regex.Matcher[pattern=.*type1.*|.*type2.* region=0,24 lastmatch=]

scala> val matches = matcher.find()
matches: Boolean = true

答案 1 :(得分:-1)

正则表达式中的OR非常简单:只需使用|即可。所以你会想要一些看起来像的东西:

type1|type2