我们经常看见下载的日志中返回码是206的情况,那么206是什么?

服务器已经成功处理了部分 GET 请求。类似于 FlashGet 或者迅雷这类的 HTTP 下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。

206是指下载包被拆分多个导致,由此可见如果我们单纯的统计200的个数是远远不够的,我们还有兼顾206的情况,而每个206的请求都是包的一部分,统计206的条目也不可能准确的。

我们撰写脚本:

即是:

1:同一个ip,请求的返回码200和206的请求大小的总和除以单个apk包的大小(整数倍数,舍弃小数位)为该ip下载包的个数。

2:将所有ip下载包的个数相加,则为下载包的总次数。


脚本:

#!/bin/env python
import os,sys,re,datetime
passt = datetime.datetime.now() - datetime.timedelta(minutes=60)
curtime2 = passt.strftime('%Y%m%d')
print curtime2
"""
192.168.100.8 - - [20/May/2015:16:17:14 +0800] "GET /p_w_picpaths/icon_app_sq.png HTTP/1.0" 206 35899
192.168.100.8 - - [20/May/2015:16:17:14 +0800] "GET /p_w_picpaths/icon_app_sq.png HTTP/1.0" 200 135899
192.168.100.48 - - [20/May/2015:16:13:32 +0800] "GET /apk/test/20001/test_20001.apk HTTP/1.0" 200 3245652
192.168.100.48 - - [20/May/2015:12:51:46 +0800] "GET /apk/test/20001/test_20001.apk HTTP/1.0" 206 65536
"""
f=open('/backup/nginxlog/aggday/access.log.'+curtime2)
#p=re.compile('([0-9.]+) .*20/Mar/2015:16:[0-2][0-9]+:.*test_20001.apk HTTP/1.[0-1]" (200) ([0-9]+) .*')
p=re.compile('([0-9.]+) .*test_20001.apk HTTP/1.[0-1]" (20[0-9]) ([0-9]+) .*')
d={}
for line in f:
	if re.match(p,line) is not None:
		ip=re.match(p,line).group(1)
        	big=int(re.match(p,line).group(3))
		total=d.get(ip,0)
		total+=big
		d[ip]=total
for ip,total in d.iteritems():
	num=dir.get(ip,0)
	num= total/3245000       #3245000 为包的大小
	dir[ip]=num
	
for line in f:
        if re.match(p,line) is not None:
                ip=re.match(p,line).group(1)
                big=int(re.match(p,line).group(3))
                bigtotal=d.get(ip,0)
                bigtotal=+big
                num=bigtotal/6300000
                num+=int(d.get(ip,0))
                d[ip]=num	
#print d
print sum(dir.values())