【问题标题】:Grok filtering in logstash for multiple defined patterns在logstash中为多个定义的模式进行Grok过滤
【发布时间】:2017-03-07 13:45:42
【问题描述】:

我正在尝试过滤与我拥有的少数模式匹配的日志。例如:

E/vincinity/dholland_view_sql_global/IN/Cluster_Node/SSL-CACHE/Dsal1
F/vincinity/dholland_view_sql_local/IN/Cluster_Node3/SSL-CACHE/Dsal4

R/vincinity/dholland_view_sql_bran/IN/Cluster_Node/Sample/vr1.log

现在我想从一堆日志中 grep 这 3 条路径:基本上我要提取的模式是包含“vincinity”、“sql”和“IN”的日志,所以使用正则表达式它只是*vincinity*sql*IN* 我试过这个 grok 过滤器:

grok {

    match => { "Vinc" => "%{URIPATHPARAM:*vincinity*sql*IN*}" }

  }

然后我在 kibana 中得到 _grokparsefailure - 我是 grok 的新手,所以也许我没有正确处理这个问题。

【问题讨论】:

  • 你的表达很接近。 (?<field_name>.*?vincinity.*?sql.*?IN.*) 可能适合你。 .*? 构造是 .* 的非贪婪等价物,因此应该使其性能更好一些。更少的子字符串搜索。

标签: elasticsearch logstash logstash-grok


【解决方案1】:

来自grok filter documentation

grok 模式的语法是 %{SYNTAX:SEMANTIC}

grok 过滤器的工作方式是

grok {
  match => {
    "message" => "%{PATTERN:named_capture}"
  }
}

message 是您要解析的字段,这是大多数输入放置未解析日志的默认字段。

URIPATHPARAM 模式是一个 predefined in logstash 通过一种称为 Onigurama 的正则表达式语言。它可能与您的整个日志消息匹配,但不会为您捕获其中的某些部分。

如需帮助构建 grok 模式,请查看 docs,它们链接到几个有用的模式构建工具。

【讨论】:

    【解决方案2】:

    在 grok 块中使用 custom pattern 的正确格式是:

    (?<field_name>the pattern here)
    

    或者您可以像这样在单独的文件 (my-pattern.txt) 中定义自己的自定义模式(使用正则表达式):

    MYPATH_MUST_BE_UPPERCASE Regex_Pattern
    

    保存在./patterns目录中,然后这样使用:

    grok {
         patterns_dir => "./patterns"
         match => ["message" , "%{MYPATH_MUST_BE_UPPERCAS:path}"]
    }
    

    在你的情况下:

    (?<vincinity>(?>/\s*.*?vincinity.*?\s*)+)
    (?<sql>(?>/\s*.*?sql.*?/\s*)+)
    (?<in>(?>\s*.*?(IN).*?\s*)+)
    

    【讨论】:

    • 这很有用,但后来我得到 _grokparseexception
    • grokdebug.herokuapp.com检查你的正则表达式,你的表达式中不应该有任何新行(\n或enter)
    • 现在这很奇怪,正则表达式正在过滤 regexr.com 而不是 grokdebug.herokuapp.com .*vincinity.*sql.*IN.*
    猜你喜欢
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    相关资源
    最近更新 更多