【问题标题】:NGINX log filter $upstream_response_time JSON ELK "-" parsefailureNGINX 日志过滤器 $upstream_response_time JSON ELK "-" parsefailure
【发布时间】:2016-04-22 08:33:49
【问题描述】:

我的 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 发生的地方。

有什么想法吗?

【问题讨论】:

  • 作为一种变通方法,您可以在它后面加上一个零。所以它要么变成0.1230-0,都是完全有效的数字:)
  • 或者使用map指令
  • 正则表达式中不需要斜杠,甚至根本不需要正则表达式。

标签: json nginx elastic-stack filebeat


【解决方案1】:

试试这个:

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

$upstream_response_time 一个数字或未设置。 Nginx 将未设置的变量记录为破折号 (-),但 map 将它们视为空字符串。

【讨论】:

  • 谢谢!这有效:map $upstream_response_time $temprt { default $upstream_response_time; "" 0; } 似乎它是空的,如果是这样的话,它在幕后的某个地方被设置为“-”。
  • 谢谢,已解决
  • @JesperPersson nginx 用日志模块github.com/nginx/nginx/blob/master/src/http/modules/…中的破折号替换未设置的变量@
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    相关资源
    最近更新 更多