Logstash - 错误事件类型,Non-string/integer 类型值集

Logstash - Bad event type, Non-string/integer type value set

我想使用 Log4j 从 Java 应用程序通过 TCP 将日志发送到我的 logstash 服务器。 两台服务器之间的通信运行良好,但是当我从我的 Java 应用程序接收日志时,我在 logstash 的日志文件中遇到错误:

[2017-04-19T09:15:18,549][WARN ][logstash.outputs.elasticsearch] Failed action. {:status=>400, :action=>["index", {:_id=>nil, :_index=>"hadoopws_log-2017.04.19", :_type=>"[\"log4j\", \"001\"]", :_routing=>nil}, 2017-04-19T07:15:18.486Z 10.10.2.100:60283 "ROUM" 8962 001 2 3136 109 3245], :response=>{"index"=>{"_index"=>"hadoopws_log-2017.04.19", "_type"=>"[\"log4j\", \"001\"]", "_id"=>"AVuFEL1uRiFXDsNz9hxO", "status"=>400, "error"=>{"type"=>"invalid_type_name_exception", "reason"=>"mapping type name [[\"log4j\", \"001\"]] should not include ',' in it"}}}}

我的 logstash 配置文件:

input {
    log4j {
    mode => "server"
    host => "hadoopmasterdev"
    port => 3456
    type => "log4j"
  }
}

filter {
   grok {
     match => { "message" => "%{DATA:request} %{WORD:idgroup} %{WORD:type} %{NUMBER:nb} %{NUMBER:process_time} %{NUMBER:render_time} %{NUMBER:total_time}" }
   }
}

output {
  elasticsearch {
    hosts => ["hadoopmasterdev:9200"]
    index => "hadoopws_log-%{+YYYY.MM.dd}"
  }
}

然后,我发送那些日志:

"test 1" 28 001 26 33 116 149

当我尝试使用 GrokDebug 验证我的 Grok 模式时,它运行良好...

非常感谢:)

您需要将第三个字段名称从 type 更改为其他名称,因为这会干扰 log4j 输入中定义的 type: log4j 字段。结果,type 字段变成一个包含两个值的数组,即 log4j001,并且不能用于定义 elasticsearch 输出中的映射类型。

只需将您的 grok 模式更改为此即可。

grok {
   match => { "message" => "%{DATA:request} %{WORD:idgroup} %{WORD:datatype} %{NUMBER:nb} %{NUMBER:process_time} %{NUMBER:render_time} %{NUMBER:total_time}" }
}