我将NGINX日志格式化为JSON:
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中进行过滤,但并没有成功。我认为需要在被传送到Logstash之前完成这个操作,因为那里发生了解析失败。
有什么想法吗?
0.1230
或-0
,两者都是完全有效的数字 :) - Alexey Tenmap
指令。 - Alexey Ten