使用Logstash很难存储具有不同字段顺序的日志文件

时间:2016-12-21 06:31:08

标签: logstash logstash-grok

我正在尝试使用Logstash将日志文件存储到elasticsearch。这样做时我遇到了问题。

如果日志文件具有如下所示的相同类型的日志行,

  

[12 / Sep / 2016:18:23:07] VendorID = 5037 Code = C AcctID = 5317605039838520   [12 / Sep / 2016:18:23:22] VendorID = 9108 Code = A AcctID = 2194850084423218   [12 / Sep / 2016:18:23:49] VendorID = 1285代码= F AcctID = 8560077531775179   [12 / Sep / 2016:18:23:59] VendorID = 1153代码= D AcctID = 4433276107716482

其中date,vendorId,code和acctID的字段出现顺序没有改变或者没有添加新元素,那么配置文件中的过滤器(如下所示)效果很好。

\[%{MONTHDAY}/%{MONTH}/%{YEAR}:%{TIME}\] VendorID=%{INT:VendorID} Code=%{WORD:Code} AcctID=%{INT:AcctID}

假设订单更改类似于下面给出的示例,或者如果将新元素添加到其中一个日志行,则会发生grokparsefailure。

  

[12 / Sep / 2016:18:23:07] VendorID = 5037代码= C AcctID = 5317605039838520
  [12 / Sep / 2016:18:23:22] VendorID = 9108 Code = A AcctID = 2194850084423218   [12 / Sep / 2016:18:23:49] VendorID = 1285代码= F AcctID = 8560077531775179   [12 / Sep / 2016:18:23:59] VendorID = 1153代码= D AcctID = 4433276107716482   [12 / Sep / 2016:18:24:50] AcctID = 3168124750473449 VendorID = 1065 Code = L   [12 / Sep / 2016:18:24:50] AcctID = 3168124750473449 VendorID = 1065 Code = L   [12 / Sep / 2016:18:24:50] AcctID = 3168124750473449 VendorID = 1065 Code = L

在此示例中,最后三个日志行与字段出现顺序的前四个日志行不同。因此,带有grok模式的过滤器消息无法解析下面三行,因为它是为前四行写的。

当我遇到这种情况时,我应该如何处理这种情况?请帮我解决这个问题。还提供任何文档的链接,以获得详细的说明。

非常感谢你。

1 个答案:

答案 0 :(得分:0)

正如baudsp正确指出的那样,这可以通过多个grok过滤器来实现。 KV过滤器似乎是一个更好的选择,但至于grok,这是一个解决方案:

input {
  stdin {}
}

filter {

    grok {
         match => {
                "message" => ".*test1=%{INT:test1}.*"
         }
    }

    grok {
         match => {
                "message" => ".*test2=%{INT:test2}.*"
         }
    }


}
output {
    stdout { codec => rubydebug }
}

通过应用2个不同的grok过滤器,我们可以忽略日志的顺序。指定的模式基本上不关心字符串test之前或之后的内容,而只是单独匹配它们各自的模式。

所以,对于这两个字符串:

test1=12 test2=23
test2=23 test1=12

您将获得正确的输出。测试:

artur@pandaadb:~/dev/logstash$ ./logstash-2.3.2/bin/logstash -f conf_grok_ordering/
Settings: Default pipeline workers: 8
Pipeline main started
test1=12 test2=23
{
       "message" => "test1=12 test2=23",
      "@version" => "1",
    "@timestamp" => "2016-12-21T16:48:24.175Z",
          "host" => "pandaadb",
         "test1" => "12",
         "test2" => "23"
}
test2=23 test1=12
{
       "message" => "test2=23 test1=12",
      "@version" => "1",
    "@timestamp" => "2016-12-21T16:48:29.567Z",
          "host" => "pandaadb",
         "test1" => "12",
         "test2" => "23"
}

希望有所帮助