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 文件访问完后在这段时间内不会被关闭。默认10秒
min_uses 在inactive时间内使用次数超过 min_uses 才会继续存在内存中。默认1
valid 超出valid时间后,将对缓存的日志文件检査是否存在。默认60秒
off 关闭缓存
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文件内容>'下面的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
http_cookie
- 含义:客户端的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
进行授权