有一天某時段一個頻道的CDN流量猛增幾百兆,分析CDN日誌查看是哪個URL使用的流量最多。輸出格式爲:URL:訪問地址 count:這URL訪問次數 flow:總的流量M 。實現思路爲:把日誌每條記錄split url爲key,流量爲value保存到詞典中。排序後輸出。
提示:頻道日誌約爲8G,我機器才4G內存,用了readlines方法,處理起來較慢用幾分鐘才完成,有很多可以優化的空間。下面是statistics_flow.py的代碼,結果直接打印到屏幕了,如需結果可以重定向到文本文件中,希望腳本的思路和寫法給大家一些提示或幫助。
#!/usr/bin/python #coding:utf-8 #Author by Qfeian@20140310 """ Usage python statistics_flow.py log_path """ import sys from operator import itemgetter if len(sys.argv) < 2: print __doc__ sys.exit(1) log = sys.argv[1] f = open(log,'r') url_flow = {} url_num = {} def sort_kv(dict, str=False): return sorted(dict.iteritems(), key=itemgetter(1), reverse=str) for line in f.readlines(): url = line.split()[6] flow = line.split()[9] if url in url_flow: url_num[url] += 1 url_flow[url] = int(url_flow[url] + int(flow)) else: url_num[url] = 1 url_flow[url] = int(flow) #sort and print sort_flow = sort_kv(url_flow, True) for url,flow in sort_flow: print "URL: %s count: %d the flow: %.3fM" % (url,int(url_num[url]), float(flow)/(1000)) #The total number of url print "The total url is %d" % len(url_num)