JSON 形式の NGINX ログがあります。
log_format le_json '{ "@timestamp": "$time_iso8601", '
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"body_bytes_sent": "$body_bytes_sent", '
'"status": $status, '
'"request": "$request", '
'"request_method": "$request_method", '
'"response_time": $upstream_response_time, '
'"http_referrer": "$http_referer", '
'"http_user_agent": "$http_user_agent" }';
私のログは filebeat によって取得され、次の構成を持つ Logstash に送信されます。
input {
beats {
port => 5044
codec => "json"
}
}
filter {
geoip {
database => "C:/GeoLiteCity.dat"
source => "[remote_addr]"
}
}
output {
elasticsearch {
template => "C:/ELK/logstash-2.2.2/templates/elasticsearch-template.json"
template_overwrite => true
hosts => ["127.0.0.1"]
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
私が抱えている問題は $upstream_response_time です。応答時間がない場合、NGINX はこの投稿に「-」を付けます。ご覧のとおり、$upstream_response_time の前後に "" を付けていません。これは、Kibana でこれを使用して計算を実行して表示できるように、数値として使用したいためです。「-」が送信されると、数値ではないため、Logstash で jsonparsefailure を取得します。
すべての「-」を 0 に設定したいのですが、これを行う最善の方法は何ですか? nginx-configでフィルタリングしようとしても成功しませんでした。parsefailure が発生する場所であるため、Logstash に出荷される前に行う必要があると思います。
何か案は?