Nginx日志

Nginx日志种类

访问日志
默认在/usr/local/nginx/logs/access.log文件中。

错误日志
默认在/usr/local/nginx/logs/error.log文件中。

定义存放位置

在配置文件nginx.conf
http块中
使用access_log指令定义

语法

#定义日志存放路径以及使用名叫main的日志格式,如果不指定日志格式,则默认使用combined日志格式
access_log logs/www.tz.com.access.log main;

日志格式

使用log_format指令定义
配置在http块中
如果不定义日志格式Nginx就会使用默认日志格式,默认日志格式名叫combined
access_log指令可以配置在http, server, location, if in location, limit_except中。

#默认combined日志格式配置如下
log_format combined '$remote_addr - $remote_user [$time_local] "$request"'
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent"';
                    
#定义日志文件存放路径以及使用格式
access_log /usr/local/nginx/logs/access.log combined

日志格式名称:combined
-为分隔符,也可以使用其他符号
如果变量没有值,则会以-符号代替。
变量跟配置指令一样,都是属于相应的模块,使用某个变量,必须先确认nginx在编译时是否启用了相应的模块。

常用内部变量说明

参考资料:官方文档-变量

日志分割

为了防止日志文件逐渐变大,我们需要对日志进行分割处理。

通过编译的方式安装nginx后,默认没有日志分割的功能,只能使用脚本实现日志分割。
通过yum源的方式安装nginx后,默认会使用系统自带的logrotate日志管理工具对nginx日志进行切割,其配置文件在/etc/logrotate.d/nginx中。

统计网站运行状态常用脚本

#统计访问Nginx服务器独立IP数
$ awk '{print $1}' access.log | sort -r |uniq -c | wc -l
3
$ awk '{print $1}' access.log |sort|uniq -c | wc -l
3

#统计总PV数(页面点击量,访问量)
$ awk '{print $7}' access.log | wc -l
113776

#统计总UV数(访问的独立IP数)
$ awk '{print $11}' access.log | sort -r | uniq -c | wc -l
10

#统计截至目前为止访问量前20的IP列表
$ awk '{print $1}' access.log |sort|uniq -c |sort -nr |head -20
 112950 127.0.0.1
    825 10.154.0.2
      1 10.154.0.111

#统计在17点05分59秒到17点11分03秒的总请求量,这里要注意的是,时间必须在日志中存在,最好先查看一下日志中的时间格式
$ sed -n '/17:05:59/,/17:11:03/'p access.log | wc -l
29881
$ awk '/17:05:59/,/17:11:03/' access.log |wc -l
29881

#统计访问日志状态码404,502,503,500,499等错误信息页面,打印错误出现次数大于20的IP地址
$ awk '{if($9~/502|499|500|503|404/) print $1,$9}' access.log |sort|uniq -c | sort -nr|awk '{if($1>20) print $2}'
127.0.0.1
10.154.0.2

#打印请求访问最多次数的页面
$ awk '{print $7}' access.log |sort|uniq -c |sort -nr|head -20
...省略

#统计请求处理时间大于5s的URL,并打印出响应时间,URL,访客IP
$ awk '{if ($NF>5)print $NF,$7,$1}' access.log |sort -nr |more
Safari/537.36" /www/ 10.154.0.2
Safari/537.36" /www/ 10.154.0.2
Safari/537.36" /www/ 10.154.0.2

编写脚本实现日志分割

nginx进程读写日志文件时,是通过文件描述符去操作的,也就是我们即使重命名日志文件名也没用。

#将日志文件access.log改名为access-20201231.log,日志还是继续写入到access-20201231.log中
$ mv access.log access-20201231.log

#这时我们可以使用reopen信号,让Nginx新建日志文件并将新日志写入新建的文件中。
$ nginx -s reopen
#以上命令等同于
$ kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

分割日志脚本
在/data/sh/目录下编辑auto_nginx_log.sh文件,内容如下

$ cat auto_nginx_log.sh
#!/bin/bash
#auto mv nginx log shell

S_LOG=/usr/local/nginx/logs/access.log
#分割后的日志保存在/data/backup/目录下
D_LOG=/data/backup/
echo  "Please wait start cut shell scripts..."
sleep 2
if [ ! -d $D_LOG ];then
  mkdir -p $D_LOG
fi 
mv $S_LOG $D_LOG/access-`date +%Y%m%d`.log
kill -USR1 'cat /usr/local/nginx/logs/nginx.pid'
echo "--------------------------------------"
echo "The Nginx log Cutting Successfully!"
echo "You can access backup nginx log $D_LOG/access.log files."

#将脚本写入计划任务,每天凌晨0点自动进行切割日志
$ crontab -e
0 0 * * * /bin/bash /data/sh/auto_nginx_log.sh >> /tmp/nginx_cut.log 2 >&1
#每周六凌晨2点01分运行脚本
01 02 * * 6 /bin/bash /data/sh/auto_nginx_log.sh >> /tmp/nginx_cut.log 2 >&1

学习来自:朱老师博客-Nginx短篇(6)(8),曝光Linux企业运维实战 第14章

posted @ 2020-12-31 13:09  努力吧阿团  阅读(200)  评论(0)    收藏  举报