4

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 に出荷される前に行う必要があると思います。

何か案は?

4

2 に答える 2

5

これを試して:

map $upstream_response_time $temprt {
  default $upstream_response_time;
  ""      0;
}

$upstream_response_time数値または未設定のいずれか。Nginx は設定されていない変数をダッシュ​​ ( -) としてログに記録しますがmap、それらを空の文字列として扱います。

于 2016-04-22T12:00:08.917 に答える