如何使用Apache访问日志中的ip和timestamp来近似给定访问者的“会话”?会话将包括给定时间段内的所有连续请求,例如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)]
似乎有用,你有什么意见吗?
答案 0 :(得分:1)
我给你写了一些代码然后失败并丢失它=(。
一种方式,不一定是最好的方法,是遍历这些行,维护一个IP地址字典 - &gt;其会话中的行列表。对于每一行,如果它已经在dict中,则将其附加到列表中;否则,为它做一个新的会话。然后,在循环内,检查所有会话是否到期(它们的最后一个元素的datetime
在当前行之前超过60秒);如果一个已过期,yield
并将其从字典中删除。