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