Как подойти к парсингу журнала IIS по-питонски?

1

Итак, у меня есть несколько журналов IIS, которые я бы хотел проанализировать с помощью Python (что я довольно новичок в atm). Пример журнала IIS выглядит так:

#Software: Microsoft Internet Information Server 6.0 
#Version: 1.0 
#Date: 1998-11-19 22:48:39 
#Fields: date time c-ip cs-username s-ip cs-method cs-uri-stem cs-uri-query sc-status sc-bytes cs-bytes time-taken cs-version cs(User-Agent) cs(Cookie) cs(Referrer) 

1998-11-19 22:48:39 206.175.82.5 - 208.201.133.173 GET /global/images/navlineboards.gif - 200 540 324 157 HTTP/1.0 Mozilla/4.0+(compatible;+MSIE+4.01;+Windows+95) USERID=CustomerA;+IMPID=01234 http://www.loganalyzer.net
1998-11-20 22:55:39 206.175.82.8 - 208.201.133.173 GET /global/something.pdf - 200 540 324 157 HTTP/1.0 Mozilla/4.0+(compatible;+MSIE+4.01;+Windows+95) USERID=CustomerA;+IMPID=01234 http://www.loganalyzer.net

Здесь всего 2 строки данных журнала, где у меня есть тысячи журналов. Итак, это всего лишь короткий пример.

Из этих журналов я хотел бы извлечь данные, такие как количество IP-адресов клиентов, которые сделали наибольшее количество подключений, количество загружаемых файлов, количество URI, которые были наиболее посещаемы, и т.д. В принципе, я хочу, чтобы получить некоторую статистику... Например, в результате я хотел бы увидеть что-то вроде этого:

file download_count
example1.pdf 9
example2.pdf 6
example3.doc 2

или

IP file hits
192.168.1.5 /sample/example1.gif 8
192.168.1.9 /files/example2.gif 8

Я не уверен, как подойти к этому путинским способом. Сначала мне показалось, что я разделил каждую строку журнала и сделаю список из него, и добавлю каждый из них в более крупный список (я вижу его как 2d-массив). Затем я дошел до фазы извлечения статистики из этого большого списка, и теперь, я думаю, было бы лучше сделать словарь из всех этих данных и подсчитать материал по ключам dict и значениям dict? Это лучший подход, чем использование списков? Если мне лучше использовать списки, как мне подойти к этому? Что я делаю Google, что я ищу?

Поэтому я ищу идеи о том, как это обычно делается. Благодарю.

  • 1
    Гуглите "Python IIS Parser" и посмотрите на 2 лучших совпадения (3-й - ваш вопрос)
Теги:
iis
parsing

1 ответ

3
Лучший ответ

предполагая, что skip_header(file) возвращает только строки журнала из файла и этот parse(line) извлекает (ip, path) из строки:

from collections import defaultdict
first = defaultdict(int)
second = defaultdict(lambda: defaultdict(int))
for line in skip_header(file):
    ip, path = parse(line)
    first[path] += 1
    second[ip][path] += 1

во-первых

print "path count"
for path, count in first.iteritems():
    print "%s %d" % (path, count)

для второго:

print "ip path count"
for ip,d in second.iteritems():
     for path, count in d.iteritems():
         print "%s %s %d" % (ip, path, count)
  • 0
    спасибо Дэн. Кстати, я использовал python3, поэтому, если кто-то попробует это, вам нужно использовать items () вместо iteritems () и, конечно, print ().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню