【问题标题】:Flume "OR Regex" Filtering InterceptorFlume "OR Regex" 过滤拦截器
【发布时间】:2016-12-19 19:22:29
【问题描述】:

我是 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 个过滤器? 或者也许我应该多路复用信息并制作两个不同的过滤器?

【问题讨论】:

    标签: regex expression filtering interceptor flume


    【解决方案1】:

    使用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.*
    

    匹配器 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
    

    匹配器 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
    

    【讨论】:

      【解决方案2】:

      OR 在正则表达式中既好又简单:只需使用|。所以你会想要看起来像这样的东西:

      type1|type2
      

      【讨论】:

      • 感谢您的回答,但我仍然看不到解决方案。 ¿ 结果应该是这样的? agent.sources.s_name.interceptors.i_name.regex=*."type1|type2".*
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-16
      • 2011-04-24
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多