??????運維統(tǒng)計分析驼修,通過分割nginx日志(按小時/天/星期/月)殿遂,pv統(tǒng)計訪問量以便于分析熱門操作場景诈铛。具體實施按以下幾點執(zhí)行:
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.執(zhí)行nginx -t檢測nginx.conf的配置是否異常蹲坷;
??????若提示pid的路徑無操作權(quán)限,核對終端提示的路徑與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端口,若是先終止進程撒轮,再次執(zhí)行 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文件玖姑,作用是將關(guān)鍵字相關(guān)的pv次數(shù),ip以及請求路徑上報至數(shù)據(jù)庫中慨菱。
10.將分析結(jié)果寫入文件或者數(shù)據(jù)庫
#以日期粒度更新統(tǒng)計數(shù)據(jù)
import MySQLdb
from sys import argv
import json
if __name__ == '__main__':
file, date, pvs,ip,page_url = argv
if date == "":
exit(0)
# 連接數(shù)據(jù)庫
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.將分析統(tǒng)計展示出來
獲取數(shù)據(jù)庫中保存的數(shù)據(jù)焰络,以圖標的方式展示: