# Chap14 调试、错误定位、请求追踪

# 简介

  • Nginx 允许将访问日志切分到不同格式的不同文件中,可以将默认的错误级别记录转变成低级别的记录,使开发者或者运维人员更清楚发生的情况,也便于市场分析
  • Nginx允许追踪请求的身份

# 配置访问日志

http {
  # 仅在 http 的 context 下有这个log_format的配置
  log_format geoproxy
    				 '[$time_local] $remote_addr '
    				 '$realip_remote_addr $remote_user '
    				 '$request_method $server_protocol '
    				 '$scheme $server_name $uri $status '
    				 '$request_time $body_bytes_sent '
    				 '$geoip_city_country_code3 $geoip_region '
    				 '"$geoip_city" $http_x_forwarded_for '
    				 '$upstream_status $upstream_response_time '
    				 '"$http_referer" "$http_user_agent"';
  ...
}
# 一条日志样式记录
[25/Nov/2016:16:20:42 +0000] 10.0.1.16 192.168.0.122 Derek
    GET HTTP/1.1 http www.example.com / 200 0.001 370 USA MI
    "Ann Arbor" - 200 0.001 "-" "curl/7.47.0"
server {
  # server级别的日志路径和日志格式配置
  access_log /var/log/nginx/access.log geoproxy;
}

# 配置错误日志

  • 若出现错误,应该首先查看错误日志,能快速定位,错误日志的格式不能自己定义
# log level 从低至高级别如下:debug, info, notice, warn, error, crit, alert, emerg
error_log /var/log/nginx/error.log warn;

# 收集到系统级别日志

  • 我们需要将Nginx的日志重定向到一个系统日志监听器,将日志集中到一个中心化服务
  • 一个典型的日志收集技术栈是ElasticSearch+Logstash+Kibanna
error_log syslog:server=10.0.1.42 debug;
access_log syslog:server=10.0.1.42, tag=nginx, severity=info, geoproxy;

# 请求追踪

logformat trace '$remote_addr - $remote_user [$time_local] '
								'"$request" $status $body_bytes_sent '
								'"$http_referer" "$http_user_agent" '
								'"$http_x_forwarded_for" $request_id';
upstream backend {
  server 10.0.0.42;
}
server {
  listen 80;
  # $request_id提供一个随机生成的32位十六进制的唯一编码,用于识别用户身份,日志格式中带上这个变量,便于搜索
  # 在应用服务器的日志中,也从header中记录下这个id,实现端到端的日志协同
  add_header X-Request-ID $request_id; # nginx发回给client的时候带上这个header
  location / {
    proxy_pass http://backend;
    proxy_set_header X-Request-ID $request_id; # 通过header发送到上游服务器
    access_log /var/lig/nginx/access_trace.log trace;
  }
}
最后更新: 5/31/2022, 6:43:40 AM