2010-07-31 2 views
0

주어진 방문자에 대해 "세션"을 근사하기 위해 Apache의 액세스 로그에서 ip와 timestamp를 어떻게 사용합니까? 세션에는 주어진 기간 (예 : 60 초) 내의 모든 연속 요청이 포함됩니다.아파치에서 대략적인 세션 데이터 access.log - python

로그 파일을 구문 분석하고이를 통해 IP 주소를 따르는 클래스가 있습니다 (로그는 타임 스탬프 순서대로 다행히 있습니다). 이 클래스는 다양한 로그 필드와 액세스 타임 스탬프에 대한 파이썬 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)] 

이 작동하는 것 같다, 당신이 어떤 의견이 있습니까?

+0

괜찮 으면, 그것은 다소 느린 것보다 (당신은 한 번만 고유 한 IP마다 전체 로그를 반복하고 있습니다.) ' 한 번에 할 수 있습니다. 그러나 그것이 당신의 요구에 충분히 빠르다면 괜찮을 것입니다! 도움을 청하는 – katrielalex

답변

1

나는 몇 가지 코드가 다음에 실패했다 당신이 쓴이 (= 손실 반드시 최고의

한 가지 방법, IP 주소의 사전을 유지하면서 라인을 통해 반복하는 것입니다 -.에> 라인의 목록을 해당 세션의 각 줄에 대해 이미 목록에 추가되어 있으면 목록에 추가하고 그렇지 않으면 새로운 세션을 만든 다음 루프 내에서 모든 세션의 만료 시간을 확인하십시오 (마지막 요소의 datetime은 60 초 전에 확인 됨). 현재 라인의); 만료 된 경우 yield 그걸로하고 그것을 지울에서 삭제

+0

! 체크 표시를 해 줬어. – mikewaters