簡體   English   中英

來自Apache access.log的近似會話數據-python

[英]Approximate session data from apache access.log - python

一個人如何使用Apache訪問日志中的ip和時間戳來估計給定訪問者的“會話”? 會話將包括給定時間段(例如60秒)內的所有連續請求。

我有一個類來解析日志文件,並通過它跟蹤IP地址(謝天謝地,日志按時間戳順序)。 該類創建一個字典元組,其中包含各種日志字段和一個用於訪問時間戳的python datetime對象。

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)]

似乎可行,您有什么意見嗎?

我為您編寫了一些代碼,然后失敗了,並且丟失了=(。

一種方法(不一定是最佳方法)是遍歷各行,在其會話中維護IP地址字典->行列表。 對於每一行,如果它已經在字典中,只需將其添加到列表中即可; 否則,為此進行一個新的會話。 然后,在循環中,檢查所有會話是否已過期(最后一個元素的datetime時間在當前行的60秒之前); 如果已過期,請yield並從字典中將其刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM