Я новичок в python, и мне нужно проанализировать коды состояния. У меня есть задача разобрать файл журнала HTTP:
Группировать зарегистрированные запросы по IP-адресу или коду статуса HTTP (выбирается пользователем). Рассчитайте одно из следующих (выбранных пользователем) для каждой группы:
Я произвел расчет запросов и процентов (первые два пункта). Теперь я не знаю, как подсчитать переданные байты (3-я точка).
Пример файла журнала (здесь показаны байты, код состояния: 6146, 52315, 12251, 54662):
83.149.9.216 - - [17/May/2015:10:05:00 +0000] "GET /presentations/logstash-monitorama-2013/images/redis.png HTTP/1.1" 200 25230 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"
24.236.252.67 - - [17/May/2015:10:05:40 +0000] "GET /favicon.ico HTTP/1.1" 200 3638 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0"
93.114.45.13 - - [17/May/2015:10:05:14 +0000] "GET /articles/dynamic-dns-with-dhcp/ HTTP/1.1" 200 18848 "http://www.google.ro/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CCwQFjAB&url=http%3A%2F%2Fwww.semicomplete.com%2Farticles%2Fdynamic-dns-with-dhcp%2F&ei=W88AU4n9HOq60QXbv4GwBg&usg=AFQjCNEF1X4Rs52UYQyLiySTQxa97ozM4g&bvm=bv.61535280,d.d2k" "Mozilla/5.0 (X11; Linux x86_64; rv:25.0) Gecko/20100101 Firefox/25.0"
93.114.45.13 - - [17/May/2015:10:05:04 +0000] "GET /reset.css HTTP/1.1" 200 1015 "http://www.semicomplete.com/articles/dynamic-dns-with-dhcp/" "Mozilla/5.0 (X11; Linux x86_64; rv:25.0) Gecko/20100101 Firefox/25.0"
Мой код:
import re
import sys
from collections import Counter
def countStatusCodePercentage(ipcount):
s = sum(ipcount.values())
for k,v in ipcount.items():
pct = v * 100.0 / s
print("Status code " + "=> " + str(k) + " Percentage " +"=> "+ str(pct) +"%")
def countStatusCode(ipcount):
for k,v in ipcount.items():
print("Status code " + "=> " + str(k) + " " + "Count " + "=> " + str(v))
def countIp(ipcount):
for k,v in ipcount.items():
print("IP Address " + "=> " + str(k) + " " + "Count " + "=> " + str(v))
def countIpPercentage(ipcount):
s = sum(ipcount.values())
for k,v in ipcount.items():
pct = v * 100.0 / s
print("IP Address " + "=> " + str(k) + " Percentage " +"=> "+ str(pct) +"%")
def Ip(filename):
myregex = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
val = input("Enter your choice (count, percentage or bytes transferred): ")
# regex = r'\/.+?\sHTTP\/1\..\"\s.{3}\s(.+?)\s'
with open(filename) as f:
log = f.read()
my_iplist = re.findall(myregex,log)
ipcount = Counter(my_iplist)
if(val in ["count","c"]):
countIp(ipcount)
if(val in ["percentage", "p"]):
countIpPercentage(ipcount)
def statusCode(filename):
myregex = r'\b[2-5]\d\d\s'
val = input("Enter your choice (count, percentage or bytes transferred): ")
with open(filename) as f:
log = f.read()
my_iplist = re.findall(myregex,log)
ipcount = Counter(my_iplist)
if(val in ["count","c",]):
countStatusCode(ipcount)
elif(val in ["percentage","p"]):
countStatusCodePercentage(ipcount)
if __name__ == '__main__':
filename=sys.argv[1]
val = input("Enter your choice (ip or status code): ")
if val in ["ip","IP","Ip","iP"]:
Ip(filename)
elif val in ["statusCode","code","sc","Status Code","status"]:
statusCode(filename)
Что я хочу:
IP Address => 83.149.9.216 Bytes =>6146
IP Address => 24.236.252.67 Bytes =>3638
IP Address => 93.114.45.13 Bytes =>19863
Другими словами, мне нужен метод, который рассчитывал бы для IP или кода состояния сгруппированное количество байтов .