Logstash无法处理多个异构输入

时间:2015-07-10 08:05:56

标签: regex logstash elasticsearch

假设您有两种非常不同类型的日志,例如FORTINET和NetASQ日志,您想要:

使用正则表达式解析FORTINET,使用其他正则表达式使用NETASQ。

我知道输入文件中的“type”和过滤器中的“condition”可以解决这个问题。

所以我用这个confing文件来做:

input {
  file {
       type => "FORTINET"
       path => "/fortinet/*.log"
sincedb_path=>"/logstash-autre_version/var/.sincedb"
start_position => 'beginning'
  }
    file {
        type => "NETASQ"
        path => "/home/netasq/*.log"
   }
 } 
filter {
 if [type] == "FORTINET" {

        grok {
  patterns_dir => "/logstash-autre_version/patterns"

    match => [

    "message" , "%{FORTINET}"



    ]
    tag_on_failure => [ "failure_grok_exemple" ]
    break_on_match => false


    }


}

if [type] == "NETASQ" {
        # .......
 }
}


output {

elasticsearch {
cluster => "logstash"
}


}

我收到了这个错误:

Got error to send bulk of actions: no method 'type' for arguments(org.jruby.RubyArray) on Java::OrgElasticsearchActionIndex::IndexRequest   {:level=>:error}

但是如果不使用“类型”并且我只使用FORTINET日志它就会崩溃。

我该怎么办?

1 个答案:

答案 0 :(得分:0)

我不确定这一点但也许有帮助:

我有同样的错误,我认为它是由使用这些if语句引起的:

if [type] == "FORTINET"

您的type字段与"FORTINET"进行比较,但这可能无法实现,因为"FORTINET"是一个字符串且type不是。{1}}。有时通过将类型设置为输入,如果已经有类型,则类型不会被替换,但新类型将添加到具有旧类型的列表中。您应该查看kibana(或任何地方)的数据并尝试找到类似的内容:

\"type\":[\"FORTINET\",\"some-other-type\"]

也许没有所有\" 如果您发现类似的内容,请尽量不要明确设置输入的类型,并将if语句中的type与您找到的some-other-type进行比较。

希望这有效(我与更复杂的输入/转发器合作,对我而言,它没有,但值得一试)