文章

log阶段

Log 模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
功能: 将HTTP请求相关信息记录到日志
模块: ngx_http_log_module  无法禁用

指令: log_format name [escape=default|json|none] string ...;
默认: log_format combined "...";
可以使用在: http

默认 combined 日志格式
log_format combined '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" "$http_user_agent"'


指令: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]];
      access_log off;
默认: access_log logs/access.log combined;
可以出现在: http, server, location, if in location, limit_except

> path路径可以包含变量:不打开cache时每记录一条曰志都需要打开、关闭曰志文件
> if 通过判断变量值是否为真 控制请求日志 是否记录
> 日志缓存(buffer): 减少磁盘旋转,从而降低磁盘i/o,提升nginx能效
    • 功能:批量 将内存中的日志写入磁盘
    • 写入磁盘的条件
        • 所有待写入磁盘的日志大小超出缓存大小
        • 达到flush指定的过期时间
        • worker进程执行 reopen 命令,或者正在关闭
> 日志压缩 gzip 
    • 功能:枇量压缩内存中的曰志,再写入磁盘
    • buffer大小默认为 64 KB
    • 压缩级别默认为1 (1 最快,压缩率最低,9最慢,压缩率最高)

# 对日志文件名包含变量时的优化 open_log_file_cache
# 创建一个缓存,使经常访问的日志文件或含有此变量的日志文件,不会经常的打开关闭
指令: open_log_file_cache max=N[inactive=time] [min_uses=N] [valid=time];
      open_log_file_cache off;
默认: open_log_file_cache off;
可以出现在: http, server, location
max	        缓存内的最大文件句柄数,最大字节数量, 超出后用 LRU 算法淘汰
inactive	文件访问完后在这段时间内不会被关闭。默认10min_usesinactive时间内使用次数超过 min_uses 才会继续存在内存中。默认1
valid	    超出valid时间后,将对缓存的日志文件检査是否存在。默认60off         关闭缓存

eg:
    log_format aaa '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" "$http_user_agent"'
     access_log logs/access_aaa.log aaa buffer=64k flush=1m;
     open_log_file_cache max=1000 inactive=30s valid=1m min_uses=2;


nginx中的log可引用的变量

自定义nginx-log-json(全)

log_format upstreaminfo escape=json ‘<下面的json文件内容>'

包含 {} 花括号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{ 
    "@timestamp": "$time_iso8601", 
    "remote_addr": "$remote_addr",
    "x-forward-for": "$proxy_add_x_forwarded_for", 
    "request_id": "$req_id", 
    "remote_user": "$remote_user", 
    "bytes_sent": $bytes_sent, 
    "request_time": $request_time, 
    "status": $status, 
    "vhost": "$host", 
    "request_proto": "$server_protocol", 
    "path": "$uri",
    "args": "$args", 
    "request_query": "$args", 
    "request_length": $request_length, 
    "duration": $request_time, 
    "method": "$request_method", 
    "http_referrer": "$http_referer",
    "http_user_agent": "$http_user_agent", 
    "latency": "$upstream_response_time", 
    "http_log_request_id":
    "$http_log_request_id_header", 
    "app_id": "$http_app_id", 
    "proxy_upstream_name":
    "$proxy_upstream_name", 
    "upstream": "$upstream_addr", 
    "upstream_status": "$upstream_status",
    "upstream_connect_time": "$upstream_connect_time", 
    "upstream_header_time": "$upstream_header_time",
    "upstream_response_time": "$upstream_response_time", 
    "upstream_response_length": "$upstream_response_length", 
    "upstream_cache_status": "$upstream_cache_status"
}

时间相关变量

$time_iso8601

  • 含义:以 ISO 8601 格式输出请求时间,格式为 YYYY-MM-DDTHH:MM:SS±hhmm。
  • 示例:2024-01-01T12:34:56+0800

$time_local

  • 含义:以本地时间格式输出请求时间,格式为 dd/MMM/yyyy:HH:mm:ss +zzzz。
  • 示例:01/Jan/2024:12:34:56 +0800

请求相关变量

$req_id

  • 含义:请求 ID(需通过ngx_http_req_id_module等第三方模块生成)
  • 示例: abc123xyz

$request

  • 含义:完整的请求行,包含请求方法、URI 和 HTTP 协议版本。
  • 示例:GET /index.html HTTP/1.1

$request_method

  • 含义:请求的方法,如 GET、POST、PUT 等。
  • 示例:GET

$request_uri

  • 含义:完整的请求 URI,包含查询字符串。
  • 示例:/index.html?param=value

$uri

  • 含义:经过解码和规范化后的请求 URI,不包含查询字符串。
  • 示例:/index.html

$args

  • 含义:请求的查询字符串(参数)。
  • 示例:param=value

$http_user_agent

  • 含义:客户端的 User-Agent 头信息,用于标识客户端的类型和版本。
  • 示例:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36

$http_referer

  • 含义:客户端请求的来源页面的 URL。
  • 示例:https://example.com/previous-page

$request_length

  • 含义:请求的总长度(包括请求行、头和体)
  • 示例:56567
变量名 对应 Nginx 变量 含义 示例
request_id $req_id(需模块支持) 请求 ID(需通过ngx_http_req_id_module等第三方模块生成) abc123xyz
request_proto $request_method 请求的 HTTP 方法(如 GET/POST/PUT) GET
uri $uri 规范化后的 URI 路径(不含查询参数) /index.html
args $args 请求的查询参数 page=1&size=10
request_length $request_length 请求的总长度(包括请求行、头和体) 1500
http_referrer $http_referer 客户端请求来源的 URL https://example.com
http_user_agent $http_user_agent 客户端的 User-Agent 信息 Mozilla/5.0…

客户端相关变量

$remote_addr

  • 含义:客户端的 IP 地址。
  • 示例:192.168.1.100

$remote_user

  • 含义:经过 HTTP 基础认证后的用户名。如果没有进行认证,该变量为空。
  • 示例:user1

$remote_port

  • 含义:客户端的端口号。
  • 示例:54321

$proxy_add_x_forwarded_for

  • 含义:客户端真实 IP(当 Nginx 作为反向代理时记录)
  • 示例:192.168.1.100, 10.0.0.1
  • 含义:客户端的cookie信息。
  • 示例:session_id=123456; user_name=JohnDoe;

$http_host

  • 含义:获取客户端请求中 Host 头字段的值,请求的目标服务器域名和端口
    • 与 $host 的区别:$host 会根据不同情况进行一些处理和规范化,而 $http_host 只是单纯获取 Host 头的原始值
  • 示例:example.com:8080

服务端相关变量

$server_name

  • 含义:处理请求的服务器名称。
  • 示例:example.com

$server_port

  • 含义:处理请求的服务器端口号。
  • 示例:80

$server_protocol

  • 含义:请求使用的 HTTP 协议版本,如 HTTP/1.1 或 HTTP/2。
  • 示例:HTTP/1.1

$host

  • 含义:存放请求的 host名称
  • 示例:api.example.com

响应相关变量

$status

  • 含义:服务器返回的 HTTP 状态码。
  • 示例:200

$request_time

  • 含义:请求处理总耗时(从接收第一个字节到发送最后一个字节的时间)
  • 示例:0.032

$upstream_status

  • 含义:上游服务器响应状态码
  • 示例:200

$upstream_connect_time

  • 含义:与上游服务器建立连接的耗时
  • 示例:0.015

$upstream_header_time

  • 含义:接收上游服务器响应头的耗时
  • 示例:0.025

$upstream_response_time

  • 含义:接收上游服务器响应体的耗时
  • 示例:0.030

$upstream_response_length

  • 含义:上游服务器返回的响应体大小(字节)
  • 示例:1024

$upstream_cache_status

  • 含义:缓存状态(如 MISS/HIT/EXPIRED)
  • 示例:HIT

$body_bytes_sent

  • 含义:发送给客户端的响应体字节数,不包含响应头。
  • 示例:1234

$bytes_sent

  • 含义:发送给客户端的总字节数,包含响应头和响应体。
  • 示例:1500
变量名 对应 Nginx 变量 含义 示例
latency $request_time 请求处理总耗时(从接收第一个字节到发送最后一个字节的时间) 0.042
upstream_status $upstream_status 上游服务器响应状态码 200
upstream_connect_time $upstream_connect_time 与上游服务器建立连接的耗时 0.015
upstream_header_time $upstream_header_time 接收上游服务器响应头的耗时 0.025
upstream_response_time $upstream_response_time 接收上游服务器响应体的耗时 0.030
upstream_response_length $upstream_response_length 上游服务器返回的响应体大小(字节) 1024
upstream_cache_status $upstream_cache_status 缓存状态(如 MISS/HIT/EXPIRED) HIT
本文由作者按照 CC BY 4.0 进行授权