Nginx日志格式设置

 8个月前     118  

文章目录

以下内容适用于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

 

版权声明:大帅 发表于 8个月前,共 5460 字。
转载请注明:Nginx日志格式设置 | 大帅同学

暂无评论

暂无评论...