Nginx日志格式设置

以下内容适用于Nginx,包括其衍生产品,比如apisix等!

1.访问日志

nginx服务器日志相关指令主要有两条,一条是log_format,用来设置日志格式,另外一条是access_log,用来指定日志文件的存放路径、格式和缓存大小,一般在nginx的配置文件中日记配置(/usr/local/nginx/conf/nginx.conf)。

nginx的log_format有很多可选的参数用于指示服务器的活动状态,默认的是:

log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
            '$status $body_bytes_sent "$http_referer" '
            '"$http_user_agent" "$http_x_forwarded_for"';

想要记录更详细的信息需要自己设置log_format,具体可设置的参数格式及说明如下:

  1. $remote_addr
    1. 客户端地址,示例值:192.168.X.3
  2. $remote_port
    1. 客户端端口,示例值:60668
  3. $remote_user
    1. 客户端用户名称,用于HTTP基础认证服务的用户名
  4. $time_local
    1. 访问时间和时区,示例值:18/Jul/2012:17:00:01 +0800
  5. $request
    1. 请求的URI和HTTP协议,示例值:GET /article-10000.html HTTP/1.1
  6. $request_body
    1. 客户端的请求主体:此变量可在location中使用,将请求主体通过proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass传递给下一级的代理服务器
  7. $request_body_file
    1. 将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传 递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body offfastcgi_pass_request_body offuwsgi_pass_request_body off,or scgi_pass_request_body off
  8. $request_completion
    1. 如果请求成功,值为OK,如果请求未完成或者请求不是一个范围请求的最后一部分,则为空
  9. $request_filename
    1. 当前连接请求的文件路径,由root或alias指令与URI请求生成
  10. $request_length
    1. 请求的长度 (包括请求的地址,http请求头和请求主体),示例值:860
  11. $request_method
    1. HTTP请求方法,通常为GETPOST,示例值:GET
  12. $request_time
    1. 整个请求的总时间,示例值:0.005
  13. $scheme
    1. 请求使用的Web协议,httphttps,示例值:https
  14. $http_host
    1. 请求地址,即浏览器中你输入的地址(IP或域名),示例值:www.xxxxxx.com
  15. $server_addr
    1. 服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中,示例值:192.168.X.68
  16. $server_name
    1. 服务器名
  17. $server_port
    1. 服务器端口,示例值:443
  18. $server_protocol
    1. 服务器的HTTP版本,通常为 HTTP/1.0HTTP/1.1
  19. $time_iso8601
    1. 服务器时间的ISO 8610格式,示例值:2022-09-20T10:04:50+08:00
  20. $time_local
    1. 服务器时间(LOG Format 格式)
  21. $status
    1. HTTP请求状态,示例值:200
  22. $upstream_status
    1. upstream状态,示例值:200
  23. $body_bytes_sent
    1. 传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的”%B”参数保持兼容,示例值:114
  24. $bytes_sent
    1. 传输给客户端的字节数,示例值:531
  25. $http_referer
    1. url跳转来源,用来记录从那个页面链接访问过来的,示例值:https://www.xxxxxx.com/
  26. $http_user_agent
    1. 用户终端浏览器等信息,示例值:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;
  27. $ssl_protocol
    1. SSL协议版本,示例值:TLSv1.2
  28. $ssl_cipher
    1. 交换数据中的算法,示例值:ECDHE-RSA-AES128-GCM-SHA256
  29. $upstream_addr
    1. 后台upstream的地址,即真正提供服务的主机地址,示例值:192.168.X.1:8001
  30. $upstream_response_time
    1. 请求后端服务过程中,upstream响应时间,示例值:0.002
  31. $uri
    1. 请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名。示例值:/foo/bar.html
  32. $document_uri
    1. $uri
  33. $args
    1. 请求中的参数值,示例值:Id=25
  34. $query_string
    1. $args
  35. $is_args
    1. 如果请求中有参数,值为?,否则为空字符串
  36. $document_root
    1. 当前请求的文档根目录或别名,示例值:/usr/local/apisix/html
  37. $host
    1. 优先级:HTTP请求行的主机名>HOST请求头字段>符合请求的服务器名.请求中的主机头字段,如果请求中的主机头不可用,则为服务器处理请求的服务器名称,示例值:www.xxxxxx.com
  38. $hostname
    1. 主机名,示例值:nginx-76898d864f-886jq
  39. $https
    1. 如果开启了SSL安全模式,值为on,否则为空字符串。
  40. $binary_remote_addr
    1. 客户端地址的二进制形式,固定长度为4个字节
  41. $connection
    1. TCP连接的序列号,示例值:34099
  42. $connection_requests
    1. TCP连接当前的请求数量,示例值:2
  43. $content_length
    1. Content-Length"请求头字段
  44. $content_type
    1. Content-Type"请求头字段
  45. $cookie_name
    1. cookie名称
  46. $limit_rate
    1. 用于设置响应的速度限制,示例值:0
  47. $msec
    1. 当前的Unix时间戳,示例值:1663639490.406
  48. $nginx_version
    1. nginx版本,示例值:1.21.4
  49. $pid
    1. 工作进程的PID,示例值:123
  50. $pipe
    1. 如果请求来自管道通信,值为”p”,否则为”.”
  51. $proxy_protocol_addr
    1. 获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串
  52. $realpath_root
    1. 当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径
  53. $cookie_NAME
    1. 客户端请求Header头中的cookie变量,前缀$cookie_加上cookie名称的变量,该变量的值即为cookie名称的值
  54. $http_NAME
    1. 匹配任意请求头字段;变量名中的后半部分NAME可以替换成任意请求头字段,如在配置文件中需要获取http请求头:Accept-Language$http_accept_language即可
  55. $http_x_forwarded_for
    1. 正如上面所述,当你使用了代理时,web服务器就不知道你的真实IP了,为了避免这个情况,代理服务器通常会增加一个叫做X-Forwarded-For的头信息,把连接它的客户端IP(即你的上网机器IP)加到这个头信息里,这样就能保证网站的web服务器能获取到真实IP
  56. $sent_http_NAME
    1. 可以设置任意http响应头字段;变量名中的后半部分NAME可以替换成任意响应头字段,如需要设置响应头Content-length,$sent_http_content_length即可

1.1 举例说明

1.1.1 配置文件

#vim /usr/local/nginx/conf/nginx.conf
log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" $http_x_forwarded_for '
    '"$upstream_addr" "$upstream_status" "$upstream_response_time" "$request_time"';
    include /usr/local/nginx/conf/vhost/*.conf;

1.1.2 vhost中配置文件

#vim /usr/local/nginx/conf/vhost/web.confserver
 {
  listen 80 default;
  server_name www.it300.com;
  index index.html index.htm index.php;
  root /data/httpd/it300.com;
  location ~ .*\.php?$
  {
   include fastcgi.conf;
   fastcgi_pass 127.0.0.1:9000;
   fastcgi_index index.php;
  }
  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
  {
  expires 30d;
  }
  location ~ .*\.(js|css)?$
  {
  expires 1h;
  }
  access_log /data/logs/it300.com.log access;
 }

2.错误日志

错误日志主要记录客户端访问Nginx出错时的日志格式不支持自定义。通过错误日志你可以得到系统某个服务或server的性能瓶颈等。因此将日志好好利用你可以得到很多有价值的信息。

错误日志由指令error_log来指定具体格式如下:

  • error_log path(存放路径) level(日志等级)
  • path含义同access_loglevel表示日志等级具体如下:
    • [ debug | info | notice | warn | error | crit ]
    • 从左至右日志详细程度逐级递减即debug最详细crit最少。

2.1 举例说明

error_log  logs/error.log  info;

需要注意的是error_log off并不能关闭错误日志而是会将错误日志记录到一个文件名为off的文件中。

正确的关闭错误日志记录功能的方法如下

error_log /dev/null;

上面表示将存储日志的路径设置为“垃圾桶”。

3.Nginx记录请求头/响应头到访问日志

3.1 记录请求头信息

比如下请求头部分信息:
accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9
cache-control: no-cache
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36

在Nginx的access_log中记录ua信息,如下:
"user_agent": "$http_user_agent",

tips:
    1. 获取请求头在字段前添加 $http_字段名
    2. 字段名使用下划线分隔即使在页面展示的请求头是中划线, 比如: user-agent --> user_agent

3.2 记录响应头信息

网上搜索记录响应头的文章千篇一律全是写lua实现,我觉得侵入太大,于是在官方文档上找到了这种方式。

比如下响应头部分信息:
HTTP/1.1 200 OK
Server: TencentWAF
Date: Wed, 14 Sep 2022 07:33:54 GMT
Content-Type: application/json
X-Request-Id: 10081a40-ac3a-4a67-af33-9f65f976f854
X-Cache-Lookup: Cache Miss
Transfer-Encoding: chunked
X-NWS-LOG-UUID: 10832445174481690542
Connection: keep-alive
X-Cache-Lookup: Cache Miss

在Nginx的access_log中记录content-type信息,如下:

"content_type": "$sent_http_x_request_id",
"content_length": "$sent_http_content_type",

tips:
    1. 获取请求头在字段前添加 $sent_http_字段名
    2. 字段名使用下划线分隔即使在页面展示的请求头是中划线, 比如: X-Request-Id --> x_request_id

Nginx日志格式设置
https://www.gmtgo.com/123.html
作者
大帅
发布于
2022年2月17日
许可协议