如何以Pythonic方式处理IIS日志解析?

1 投票
1 回答
2495 浏览
提问于 2025-04-16 20:26

好的,我有一些IIS日志,想用Python来解析这些日志(我现在对Python还不太熟悉)。一段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

这里只有两行日志数据,而我每个日志里有成千上万行。所以,这只是一个简短的例子。

从这些日志中,我想提取一些数据,比如:连接次数最多的客户端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

我不太确定该如何用Python的方式来处理这个问题。一开始我想把每一行日志分开,做成一个列表,然后把每个列表添加到一个更大的列表中(我把它看作一个二维数组)。然后我到了从那个大列表中提取统计数据的阶段,现在我觉得把所有数据做成一个字典,按字典的键和值来统计可能会更好?这样做比用列表更好吗?如果我应该更好地使用列表,那我该怎么做呢?我应该搜索什么,找什么呢?

所以我在寻找一些关于这通常应该怎么做的想法。谢谢。

1 个回答

4

假设 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)

撰写回答