對於組合的日誌格式,你可以掃描這樣的:
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