好的,我有一些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
我不确定如何以pythonic方式处理此问题。起初我以为我会分割日志的每一行并从中列出一个列表,然后将每一行附加到一个更大的列表中(我将其视为一个二维数组)。然后我进入了从那个大列表中提取统计数据的阶段,现在我认为用所有数据创建一个字典并用dict键和dict值计算东西可能会更好?这比使用列表更好吗?如果我应该更好地使用列表,我应该如何处理它?我该怎么去谷歌,我该寻找什么?
所以我正在寻找关于通常应该如何做的想法。感谢。
答案 0 :(得分: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)