使用logstash过滤器从字符串中解析文本

时间:2016-07-28 13:34:58

标签: filter logstash

我有一个Apache Access Log,我想在REQUEST字段中解析一些文本:

GET /foo/bar?contentId=ABC&_=1212121212 HTTP/1.1"

我想要做的是提取并将12121212122分配给一个值,但该值基于前缀ABC& _(所以我想我需要if语句或其他东西)。前缀可以采用其他形式(例如,DDD& _)

所以基本上我想说

if (prefix == ABC&_)
   ABCID = 1212121212
elseif (prefix == DDD&_)
   DDDID = <whatever value>
else
   do nothing

我一直在努力在logstash中构建正确的过滤器,以根据前缀提取id。任何帮助都会很棒。

谢谢

1 个答案:

答案 0 :(得分:2)

为此您将使用grok过滤器。

例如:

artur@pandaadb:~/dev/logstash$ ./logstash-2.3.2/bin/logstash -f conf2
Settings: Default pipeline workers: 8
Pipeline main started
GET /foo/bar?contentId=ABC&_=1212121212 HTTP/1.1"
{
       "message" => "GET /foo/bar?contentId=ABC&_=1212121212 HTTP/1.1\"",
      "@version" => "1",
    "@timestamp" => "2016-07-28T15:59:12.787Z",
          "host" => "pandaadb",
        "prefix" => "ABC&_",
            "id" => "1212121212"
}

这是您的示例输入,解析出您的前缀和ID。

这里不需要,因为GROK过滤器的正则表达式可以处理它。

但是,您可以(如果需要将其放在不同的字段中)分析您的字段并将其添加到另一个字段中。

这会输出:

GET /foo/bar?contentId=ABC&_=1212121212 HTTP/1.1"
{
       "message" => "GET /foo/bar?contentId=ABC&_=1212121212 HTTP/1.1\"",
      "@version" => "1",
    "@timestamp" => "2016-07-28T16:05:07.442Z",
          "host" => "pandaadb",
        "prefix" => "ABC&_",
            "id" => "1212121212",
         "ABCID" => "1212121212"
}
GET /foo/bar?contentId=DDD&_=1212121212 HTTP/1.1"
{
       "message" => "GET /foo/bar?contentId=DDD&_=1212121212 HTTP/1.1\"",
      "@version" => "1",
    "@timestamp" => "2016-07-28T16:05:20.026Z",
          "host" => "pandaadb",
        "prefix" => "DDD&_",
            "id" => "1212121212",
         "DDDID" => "1212121212"
}

我用于此的过滤器看起来像这样:

filter {
    grok {
        match => {"message" => ".*contentId=%{GREEDYDATA:prefix}=%{NUMBER:id}"}

    }

    if [prefix] =~ "ABC" {
         mutate {
            add_field => {"ABCID" => "%{id}"}
         }
    }

    if [prefix] =~ "DDD" {
         mutate {
            add_field => {"DDDID" => "%{id}"}
         }
    }

}

我希望这说明如何去做。您可以使用它来测试您的grok正则表达式:

http://grokdebug.herokuapp.com/

玩得开心!

阿图尔