JSON のキーと値のペアの間にスペースがあるログを解析できない

概要

json オブジェクトを含むログがあります。 json オブジェクトにスペースが含まれていない場合、ログは解析されます。キーと値のペアの間にスペースがある場合、解析されません。

使用される設定ファイル

input {
syslog {
port => 3011
}
}

filter {
grok {
match => { "message" =>
[
"%{SYSLOGTIMESTAMP:timestamp4} %{DATA:time_ms}|%{DATA:field1}|%{DATA:field2}|99|%{DATA:field3}|%{DATA:field4}|%{DATA:field5}|%{DATA:field6}|%{DATA:field7}|%{DATA:field8}|%{DATA:field9}|%{DATA:field10}|%{DATA:field11}|%{DATA:field12}|%{GREEDYDATA:field13}"
]
}
}
date {
match => ["timestamp4", "MMM dd HH:mm:ss"]
}
if [field13] {
mutate {
add_field => {"log_type" => "my-logs"}
}
}
}

output {
if [log_type] == "my-logs" {
stdout { codec => rubydebug }
elasticsearch {
hosts => ["ES_HOST:9200"]
index => "my-logs-000001"
}
}
}

解析されるログ:

echo “3 月 21 日 13:27:11 11:11.366293|dataadwhw1|ebsmp4713user5_@maiator|99|4064|22|SUCCESS|data|19|UA101|10.1.1.70|https|data.com|{”wrg_id”:“200000337”}|200” | NC ローカルホスト 3011 echo “3 月 21 日 13:27:11 11:11.366293|dataadwhw1|ebsmp4713user5_@maiator|99|4064|22|SUCCESS|data|19|UA101|10.1.1.70|https|data.com|{”wrg_id” :“200000337”}|200” | NC ローカルホスト 3011

ログが解析されません: echo “3 月 21 日 13:27:11 11:11.366293|dataadwhw1|ebsmp4713user5_@maiator|99|4064|22|SUCCESS|data|19|UA101|10.1.1.70|https|data.com|{”wrg_id”: “200000337”}|200” | NC ローカルホスト 3011

解決策

データは | で区切られた CSV 形式のようです。したがって、logstash csv パーサーを使用することをお勧めします。

filter {
  csv {
    separator => "|"
    columns => ["syslog_timestamp", "hostname", "username", "integer1", "integer2", "integer3", "result", "category", "integer4", "code", "ip", "protocol", "scheme", "url_host", "json_data", "http_status"]
  }
}

その後、空白を削除したい場合は、mutate => Stripe を使用できます。

filter {
  mutate {
     strip => ["field1", "field2"]
  }
}