nginx日志管理
- Nginx日志主要分为两种:
access_log访问日志
:通过访问日志可以得到用户的IP地址,浏览器的信息,请求的处理时间等信息。
error_log错误日志
:错误日志记录了访问出错的信息,可以用来定位错误的原因。
Nginx访问日志
1 设置访问日志
访问日志主要记录客户端的请求,客户端向Nginx服务器发起的每一次请求都记录在这里。
具体要记录哪些信息可以通过log_format指令定义。
语法:
access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; #设置访问日志
access_log off; # 关闭访问日志
// 语法说明
path: 指定日志的存放位置。
format:指定日志的格式。
buffer:指定日志写入时的缓存大小。
gzip: 日志写入前先进行压缩。压缩率可以指定,从1到9数值越大压缩比越高,同时压缩的速度也越慢。
flush: 设置缓存的有效时间。如果超过flush指定的时间,缓存中的内容将被清空。
if : 条件判断,如果指定的条件计算为0或空字符串,那么该请求不会写入日志。
作用域:
1access_log指令的作用域分别有http,server,location,limit_except
用法:
access_log /var/log/nginx/access.log main;
access_log /var/log/nginx/access.log main buffer=32k gzip flush=1m;
// 说明
指定日志的写入路径为/var/logs/nginx-access.log
日志格式使用默认的main
指定日志的缓存大小为32k
日志写入前启用gzip进行压缩
压缩比使用默认值1
缓存数据有效时间为1分钟。
2 使用log_format自定义访问日志格式
log_format语法:
Syntax: log_format name [escape=default|json|none] string ...;
Default: log_format combined "...";
Context: http
- name :格式名称。在access_log指令中引用。
- escape :设置变量中的字符编码方式是
json
还是default
,默认是default
。 - string :要定义的日志格式内容,该参数可以有多个。参数中可以使用Nginx变量。
默认日志格式:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
10.0.0.1 - - [27/Aug/2021:01:13:52 -0400] "GET /favicon.ico HTTP/1.1" 404 3971 "http://10.0.0.4/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
默认日志格式说明:
字段 | 含义 |
---|---|
$remote_addr | 客户端地址 |
$remote_user | 验证的用户名 |
$time_local | 访问时间和时区 |
$request | 请求的URI和HTTP协议 |
$status | HTTP请求状态 |
$body_bytes_sent | 发送给客户端文件内容大小 |
$http_referer | url跳转来源 |
$http_user_agent | 用户终端浏览器等信息 |
$http_x_forwarded_for | 简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项,第一个值为真实的ip |
日志格式常用变量:
$remote_addr # 记录客户端IP地址(只记录上一个客户端IP)
$remote_user # 记录客户端用户名
$time_local # 通用日志格式下的本地时间,如"27/Aug/2021:01:13:52 -0400"
$time_iso8601 # 标准格式的本地时间,形如“2021-08-27T02:08:22-04:00”
$request # 记录请求的方法以及请求的http协议
$request_uri # 完整的请求地址,如 "https://daojia.com/"
$status # 记录请求状态码(用于定位错误信息)
$body_bytes_sent # 发送给客户端的资源字节数,不包括响应头的大小
$bytes_sent # 发送给客户端的总字节数
$msec # 日志写入时间。单位为秒,精度是毫秒。
$http_referer # 记录从哪个页面链接访问过来的
$http_user_agent # 记录客户端浏览器相关信息
$http_x_forwarded_for #记录经过的所有服务器的客户端IP地址
$X-Real-IP # 记录起始的客户端IP地址和上一层客户端的IP地址
$request_length # 请求的长度(包括请求行, 请求头和请求正文)。
$request_time # 请求花费的时间,单位为秒,精度毫秒
$connection # 连接序列号
$connection_requests # 当前通过连接发出的请求数量
自定义日志格式main格式:
// 修改默认日志格式
# vim /etc/nginx/nginx.conf
log_format main '$remote_addr - $remote_user [$time_iso8601] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$msec" ';
// 查看显示日志
# tail -f /var/log/nginx/access.log
10.0.0.1 - - [2021-08-27T01:58:29-04:00] "GET /favicon.ico HTTP/1.1" 404 3971 "http://10.0.0.4/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36" "-" "1630043909.257"
自定义日志格式json格式:
// 修改格式
log_format json '{"@timestamp":"$time_iso8601",'
'"host": "$server_addr",'
'"client": "$remote_addr",'
'"size": $body_bytes_sent,'
'"responsetime": $request_time,'
'"domain": "$host",'
'"url":"$request_uri",'
'"referer": "$http_referer",'
'"agent": "$http_user_agent",'
'"status":"$status",'
'"x_forwarded_for":"$http_x_forwarded_for"}';
// 指定使用json日志格式
# access_log /var/log/nginx/access.log json;
// 查看json格式访问日志
{"@timestamp":"2021-08-27T02:08:22-04:00","host": "10.0.0.4","client": "10.0.0.1","size": 4057,"responsetime": 0.000,"domain": "10.0.0.4","url":"/","referer": "-","agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36","status":"200","x_forwarded_for":"-"}
Nginx错误日志
语法:
error_log file [level];
default:error_log /var/log/nginx/error.log notice;
// 语法说明:
第一个参数指定日志的写入位置。
第二个参数指定日志的级别。
level可以是:debug , info , notice , warn , error , crit , alert , emerg 中的任意值。
可以看到其取值范围是按紧急程度从低到高排列的。
只有日志的错误级别等于或高于level指定的值才会写入错误日志中。
用法:
error_log /var/log/nginx/error.log error;
// 指定了错误日志的路径为:/var/log/nginx/error.log,日志级别使用error。
作用域:
它可以配置在:main,http , mail , stream , server , location 作用域。
Nginx日志切割
# vim /etc/logrotate.d/nginx
/var/log/nginx/*log {
create 0664 nginx root
#每天切割日志
daily
#日志保留时间 10天
rotate 10
#忽略日志丢失
missingok
notifempty
#日志压缩
compress
#开始执行脚本
sharedscripts
#标注脚本内容
postrotate
#判断nginx启动
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
#脚本执行完毕
endscript
}