来自apache access.log的近似会话数据 - python

时间:2010-07-31 00:13:58

标签: python

如何使用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)]

似乎有用,你有什么意见吗?

1 个答案:

答案 0 :(得分:1)

我给你写了一些代码然后失败并丢失它=(。

一种方式,不一定是最好的方法,是遍历这些行,维护一个IP地址字典 - &gt;其会话中的行列表。对于每一行,如果它已经在dict中,则将其附加到列表中;否则,为它做一个新的会话。然后,在循环内,检查所有会话是否到期(它们的最后一个元素的datetime在当前行之前超过60秒);如果一个已过期,yield并将其从字典中删除。