对于组合的日志格式,你可以扫描这样的:
In [1]: import re
In [2]: text = '127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"'
In [3]: logitems = re.compile('^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) ([^ ]*) ([^ ]*) \[([^\]]*)\] "([^"]*)" \d+ \d+ "([^"]*)" "([^"]*)"')
In [4]: logitems.findall(text)
Out[4]: [('127.0.0.1', '-', 'frank', '10/Oct/2000:13:55:36 -0700', 'GET /apache_pb.gif HTTP/1.0', 'http://www.example.com/start.html', 'Mozilla/4.08 [en] (Win98; I ;Nav)')]
假设text
包含日志文件文本,使用re.findall
会产生一个元组的列表包含您想要的信息。
假设你有元组的这份名单中,使用列表中理解和一组以获得独立IP(我用一个简单的二元组用于演示目的在这里):
In [4]: lst = [('127.0.0.1', 'foo'), ('192.168.0.1', 'bar'), ('123.022.200.023', 'baz'), ('127.0.0.1', 'double')]
In [5]: [i[0] for i in lst]
Out[5]: ['127.0.0.1', '192.168.0.1', '123.022.200.023', '127.0.0.1']
In [6]: list(set([i[0] for i in lst]))
Out[6]: ['192.168.0.1', '123.022.200.023', '127.0.0.1']
对于所有IP地址,然后你可以得到所有的访问:
In [8]: [i for i in lst if i[0] == '127.0.0.1']
Out[8]: [('127.0.0.1', 'foo'), ('127.0.0.1', 'double')]
然后,您可以按日期进一步过滤(将其转换为datetime.datatime
!)和操作系统。
什么是Apache Access日志的“默认格式”?如果你在谈论通用日志格式,它不包含任何用户代理信息... – FrankieTheKneeMan
我的错误,格式实际上是:('127.0.0.1',' - ','frank','10/Oct/2000:13:55:36 -0700','GET /apache_pb.gif HTTP/1.0','http://www.example.com/start.html','Mozilla/4.08 [en](Win98; I ; Nav)') – tsspires