繁体   English   中英

NGINX日志过滤器$ upstream_response_time JSON ELK“-” parsefailure

[英]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会在该帖子上添加“-”。 如您所见,我没有在$ upstream_response_time周围加上“”,因为我希望将其作为一个数字,这样我就可以在Kibana中进行显示并显示出来。 当发送“-”时,我在Logstash中收到jsonparsefailure,因为它不是数字。

我想将所有的“-”都设置为0。什么是最好的方法? 我尝试在nginx-config中对其进行过滤没有成功。 我认为这需要在运送到Logstash之前完成,因为这是发生parsefailure的地方。

有任何想法吗?

尝试这个:

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" }';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM