NGINX 日志过滤器 $upstream_response_time JSON EACH “-” 解析失败
NGINX log filter $upstream_response_time JSON ELK "-" parsefailure
我的 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 会在此 post 上放置一个 '-'。如您所见,我没有在 $upstream_response_time 周围放置“”,因为我希望它是一个数字,这样我就可以在 Kibana 中使用它进行计算并显示。发送“-”时,我在 Logstash 中收到 jsonparsefailure,因为它不是数字。
我想将所有“-”设置为 0。最好的方法是什么?
我尝试在 nginx-config 中过滤它没有成功。我认为这需要在运送到 Logstash 之前完成,因为那是发生解析失败的地方。
有什么想法吗?
试试这个:
map $upstream_response_time $temprt {
default $upstream_response_time;
"" 0;
}
$upstream_response_time
一个数字或未设置。 Nginx 将未设置的变量记录为破折号 (-
),但 map
将它们视为空字符串。
来自@AlexeyTen 的充实示例使用 null 而不是 0 来区分实际值,因为我不是 100% 确定如何使用映射变量:
map $upstream_response_time $temprt {
default $upstream_response_time;
"" null;
}
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": $temprt, '
'"http_referrer": "$http_referer", '
'"http_user_agent": "$http_user_agent" }';
我的 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 会在此 post 上放置一个 '-'。如您所见,我没有在 $upstream_response_time 周围放置“”,因为我希望它是一个数字,这样我就可以在 Kibana 中使用它进行计算并显示。发送“-”时,我在 Logstash 中收到 jsonparsefailure,因为它不是数字。
我想将所有“-”设置为 0。最好的方法是什么? 我尝试在 nginx-config 中过滤它没有成功。我认为这需要在运送到 Logstash 之前完成,因为那是发生解析失败的地方。
有什么想法吗?
试试这个:
map $upstream_response_time $temprt {
default $upstream_response_time;
"" 0;
}
$upstream_response_time
一个数字或未设置。 Nginx 将未设置的变量记录为破折号 (-
),但 map
将它们视为空字符串。
来自@AlexeyTen 的充实示例使用 null 而不是 0 来区分实际值,因为我不是 100% 确定如何使用映射变量:
map $upstream_response_time $temprt {
default $upstream_response_time;
"" null;
}
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": $temprt, '
'"http_referrer": "$http_referer", '
'"http_user_agent": "$http_user_agent" }';