从apache access.log获取近似会话数据 - python
如何利用Apache的访问日志中的IP和时间戳来大致估算一个访客的“会话”?一个会话可以理解为在一定时间内,比如60秒内,所有连续的请求。
我有一个类可以解析日志文件,并跟踪一个IP地址(日志是按时间戳顺序排列的,这点很不错)。这个类会创建一个包含字典的元组,这些字典里有各种日志字段和一个Python的日期时间对象,用于记录访问的时间戳。
class ApacheLogParser(object):
def __init__(self, file):
self.lines = __parse(file)
def __parse(self, file):
""" use a regex to parse the file
return a tuple of dictionaries
"""
def follow_ip(self, ip):
""" all entries for a given ip, in order of appearance in the log """
return (line for line in self.lines if re.search(ip, line['ip']))
log = ApacheLogParser('access.log')
for line in log.follow_ip('1.2.3.4'):
print "%s %s" % (line['path'], line['datetime'].date())
我该如何给这个类添加功能,以便能够遍历这些大致估算的“会话”呢?
谢谢!
编辑:在我编辑的时候,我想到了这个:
ip = '1.2.3.4'
ipdata = list(log.track_ip(ip))
initial_dt = ipdata[0]['datetime']
sess = [x for x in ipdata if x['datetime'] < initial_dt + datetime.timedelta(0,60)]
看起来可以工作,你有什么意见吗?
1 个回答
1
我给你写了一些代码,但不小心搞砸了,结果丢了 =(。
有一种方法,虽然不一定是最好的,就是逐行处理这些数据,同时维护一个字典,字典的内容是IP地址和它对应的会话行列表。对于每一行,如果这个IP地址已经在字典里了,就把这一行加到它的列表里;如果没有,就为它新建一个会话。在这个循环中,还要检查所有会话是否过期(也就是它们最后一行的时间是否比当前行的时间早了60秒以上);如果有会话过期了,就把它返回并从字典中删除。