前言
环境:centos 7.9 nginx version: nginx/1.18.0
nginx会将每个用户访问网站的日志信息保存在/usr/local/nginx/logs/access.log中,这些访问日志信息都是为了供网站提供者分析用户的浏览行为,此日志功能是由ngx_http_log_module模块提供的。
nginx访问日志语法配置说明( access.log)
记录日志信息的格式是什么以及日志文件存放位置,这些操作由nginx.conf配置文件来配置的,如图,nginx的访问日志语法配置设置在http标签内,如下图:
nginx日志格式定义语法
nginx日志格式定义语法如下:
log_format 格式标签名 string....; #其中log_format是关键字,标签名
nginx的默认日志格式如上图所示那样,为:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#其中main就是日志格式的标签名
nginx定义访问日志文件语法
定义好了日志的格式(可以有多种格式),那么就来定义日志文件名、存放的位置以及使用哪种格式记录日志,语法如下:
access_log /xxx/xxxx/filename 格式标签名;
nginx记录日志的默认参数如下:
access_log logs/access.log main;
nginx日志格式变量说明
默认的日志格式如下,有很多内置的变量,下面来讲一下这些变量的含义:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
nginx日志变量 | 说明 |
---|---|
$remote_addr | 远程客户端地址 |
$remote_user | 远程客户端用户名 |
$time_local | 记录访问的时间 |
$request | 用户的http请求起始行信息 |
$status | http状态码,记录请求返回的状态,如:200,404,301等 |
$body_bytes_sent | 服务器发给客户端的响应body字节数 |
$http_referer | 记录此次请求是从哪个链接访问过来的,可根据referer进行防盗链设置 |
$http_user_agent | 记录客户端访问信息,例如:浏览器、手机客户端等 |
$http_x_forwarded_for | 当前端有代理服务器时,设置web节点记录客户端地址的配置 |
在没有特殊情况下,保持nginx访问日志的默认格式就行了,更多变量可以查阅官方网站https://nginx.org/en/docs/http/nginx_log_module.html
记录日志的access_log参数说明
语法如下:
access_log path format gzip[=level] [buffer=size] [flush=time] ;
gzip[=level]表示压缩级别,buffer=size表示存放访问日志的缓冲区大小,flush=time为将缓冲区刷到磁盘的时间,一般情况下都无须修改这些参数的默认值。
访问日志配置实战
在http标签定义日志格式,然后在虚拟主机里使用该格式来记录访问日志,具体实现如下:
在虚拟主机中引用访问日志格式:
第1个虚拟主机引用访问日志格式:
第2个虚拟主机引用访问日志格式:
第3个虚拟主机引用访问日志格式:
在网页方别测试3个虚拟主机:http://192.168.43.120:81/、http://192.168.43.120:82/、http://192.168.43.120:83/,查看访问日志:
测试发现,访问日志均能按照给定的格式记录日志,访问日志配置正常。
nginx访问日志轮询切割
实际生产中,随着业务访问的日增月累,访问日志的大小会越来越大,这不利于日志的分析和处理,所以有必要对日志进行按天或按小时进行切割,使其分成不同的文件保存,下面将对访问日志进行按天分割,脚本如下:
vim /usr/local/nginx/server_script/cut_access_log.sh
#!/bin/bash
Dateformat=`date +%Y%m%d`
Basedir="/usr/local/nginx"
Nginxlogdir="${Basedir}/logs"
fujiseiko_first="fujiseiko_first.access.log"
fujiseiko_second="fujiseiko_second.access.log"
fujiseiko_third="fujiseiko_third.access.log"
[ -d ${Nginxlogdir} ] && cd $Nginxlogdir || exit 1
[ -f ${fujiseiko_first} ] || exit 1
/bin/mv ${fujiseiko_first} ${Dateformat}_${fujiseiko_first}
[ -f ${fujiseiko_second} ] || exit 1
/bin/mv ${fujiseiko_second} ${Dateformat}_${fujiseiko_second}
[ -f ${fujiseiko_third} ] || exit 1
/bin/mv ${fujiseiko_third} ${Dateformat}_${fujiseiko_third}
/usr/bin/nginx -s reload
注意:脚本实现了切割nginx日志的想法,其主要实现步骤为:将正在写入的Nginx日志改名为带日期格式的文件,然后平滑重启重新加载nginx,因为改了访问日志文件名,所以nginx重启时检查配置文件后发现实际目录并没有定义格式中的访问日志文件名,所以nginx又会重新生成虚拟主机里配置的访问日志文件。
最后通过定时任务每天晚上00:00定时执行脚本,即可实现按天切割nginx日志文件。
crontab -e
00 00 * * * /bin/bash /usr/local/nginx/server_script/cut_access_log.sh >/dev/null 2>&1