运维统计分析,通过分割nginx日志(按小时/天/星期/月),pv统计访问量以便于分析热门操作场景。具体实施按以下几点执行:
1.获取nginx配置nginx.conf文件所在的目录;
如/etc/nginx/nginx.conf
2.nginx.conf指定pid文件的存放位置;
pid /wls/nginx/nginx.pid;
3.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;
其中,access表示日志类型的别名
4.nginx.conf指定日志文件存放的位置,并指定日志格式;
access_log /etc/nginx/logs/access.log access;
5.执行nginx -t检测nginx.conf的配置是否异常;
若提示pid的路径无操作权限,核对终端提示的路径与nginx.conf中配置是否一致。若不一致,请以终端返回的地址为准;
2018/09/24 09:53:55 [emerg] 55408#0: open() "/run/nginx.pid" failed (13: Permission denied)
如终端提示的pid文件地址为"/run/nginx.pid",将配置的地址pid /wls/nginx/nginx.pid改为pid /run/nginx.pid;
6.指定nginx的配置文件路径
nginx -c /etc/nginx/nginx.conf
若终端提示端口占用,先查看端口是否为nginx端口,若是先终止进程,再次执行 nginx -c命令
7.重启nginx;
sudo nginx -s reload
8.定期将日志分割备份;
指明日志存放路径
LOG_HOME="/etc/nginx/logs/"
获取日期变量,保存为前一天的日志
day=$(date -d '-1day' +%Y%m%d)
备份日志文件,以日期分割
echo 'paic1234' | sudo -S mv $LOG_HOME/access.log $LOG_HOME/access.log-$day
# 重读日志
echo 'paic1234' | sudo -S kill -USR1 `cat /run/nginx.pid`
9.分析分割后的日志
pvs = `awk '{print $7}' $NGINX_LOG_PATH | grep $keywords | grep "\.html" | wc -l`
echo pvs = $pvs
IP = `awk '{print $1 " " $7}' $NGINX_LOG_PATH | grep $keywords | grep "\.html" | awk '{print $1}'|sort | uniq -c |wc -l`
echo IP = $IP
page_url = `awk '{print $7}' $NGINX_LOG_PATH | grep $keywords | grep "\.html" |sort | uniq -c |sort -n -k 1 -r |head -n 10`
echo page_url = $page_url
...
result=`python $PYTHON_SCRIPT $DATE $pvs $IP $page_url `
echo $result
其中,$NGINX_LOG_PATH
为nginx日志文件地址,$PYTHON_SCRIPT
为第10步中的python文件,作用是将关键字相关的pv次数,ip以及请求路径上报至数据库中。
10.将分析结果写入文件或者数据库
#以日期粒度更新统计数据
import MySQLdb
from sys import argv
import json
if __name__ == '__main__':
file, date, pvs,ip,page_url = argv
if date == "":
exit(0)
# 连接数据库
db = MySQLdb.connect(host="xx", port=3306, user="test",passwd="test",db="test",charset="utf8")
# cursor()操作游标
cursor = db.cursor()
cursor.execute("SELECT * from tb_test where date='"+date+")
data = cursor.fetchone()
if data:
sql = "UPDATE sql"
else:
sql = "INSERT INTO sql"
try:
cursor.execute(sql)
db.commit()
except:
db.rollback()
db.close()
11.将分析统计展示出来
获取数据库中保存的数据,以图标的方式展示:
网友评论