Web服務器的各種系統管理工作包括了多Nginx/Apache 日誌的統計,python使這個任務變得極其簡單,下面分享兩個小腳本。
一、統計Nginx的客戶端緩存的命中率
需要檢查你的Nginx服務器拒絕客戶請求的頻率,服務器拒絕的原因是因爲客戶緩存中的頁面已經更新過了。
解決方案:
當瀏覽器請求一個在它的緩存中的服務器頁面時,瀏覽器首先會讓服務器瞭解緩存數據,如果客戶緩存是更新過的,服務器會返回一個特殊的錯誤碼(而不是再次提供該頁面)。下面是在服務器的日誌中統計這種現象的代碼:
#!/usr/bin/env python import sys logfile = sys.argv[1] def ClientCache(logfile_path): contents = open(logfile, "r") totalrequests = 0 cacherequests = 0 for line in contents: totalrequests += 1 if line.split(" ")[8] == "304": cacherequests += 1 print "Percentage of requests that were client-cached: ", str(cacherequests) + "%"
運行結果如下:
[root@chlinux logs]# ./nginx_log.py access.log Percentage of requests that were client-cached: 17%
討論:
服務器的服務請求在客戶端的緩存中的比例是衡量服務器效能的一個重要的因素。此腳本的代碼能幫你從服務器日誌中獲取這種信息。
此腳本的代碼利用循環,每次讀取日誌文件中的一行,這也是讀取文件的常用方式。for循環的主體部分調用split 方法來切割行字符串,它使用一個單空格字符串作爲參數,將整行切成了由空格隔開的字段,並組成一個元組,然後它使用索引([8])來獲取第9個字段。
二、檢查Nginx的訪問日誌,統計基於每個獨立IP地址的點擊率
檢查Nginx的日誌文件,統計基於每個獨立IP地址的點擊率,代碼如下:
#!/usr/bin/env python #coding:utf8 import re import sys contents = sys.argv[1] def NginxIpHite(logfile_path): #IP:4個字符串,每個1到3個數字,由點連接 ipadd = r'\.'.join([r'\d{1,3}']*4) re_ip = re.compile(ipadd) iphitlisting = {} for line in open(contents): match = re_ip.match(line) if match: ip = match.group( ) #如果IP存在增加1,否則設置點擊率爲1 iphitlisting[ip] = iphitlisting.get(ip, 0) + 1 print iphitlisting NginxIpHite(contents)
運行結果如下:
[root@chlinux 06]# ./nginx_ip.py access_20130617.log {'183.3.121.84': 1, '182.118.20.184': 2, '182.118.20.185': 1, '190.52.120.38': 1, '182.118.20.187': 1, '202.108.251.214': 2, '61.135.190.101': 2, '103.22.181.247': 1, '101.226.33.190': 3, '183.129.168.131': 1, '66.249.73.29': 26, '182.118.20.202': 1, '157.56.93.38': 2, '219.139.102.237': 4, '220.181.108.178': 1, '220.181.108.179': 1, '182.118.25.233': 4, '182.118.25.232': 1, '182.118.25.231': 2, '182.118.20.186': 1, '174.129.228.67': 20}
此腳本返回的是一個字典,其中包含了訪問Nginx 服務器的各個IP的點擊數,這是通過分析Nginx日誌文件的來的.在這個腳本中我們使用正則表達式來獲得並同時驗證IP,這個方法避使得我們避免了字符串切分操作和長度檢查,但我們卻不得不負擔匹配正則表達式運行的開銷。