[英]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.