>백엔드 개발 >파이썬 튜토리얼 >nginx 액세스 로그의 Python 정기 분석

nginx 액세스 로그의 Python 정기 분석

高洛峰
高洛峰원래의
2017-02-21 10:46:401349검색

서문

이 글의 스크립트는 nginx의 접속 로그를 분석하는 것으로, 주로 사이트 uri의 방문 횟수를 확인하는 목적으로 확인 결과를 제공할 예정이다. 연구개발 인력에게 참고용으로, 분석을 할 때에는 정규식을 사용해야 하기 때문에 정규식을 접해 본 적이 없는 친구들도 스스로 정규식의 내용을 보충하라고 하기 때문입니다. 확장하는 것은 정말 불가능합니다. 정규식의 내용이 너무 방대하고 기사를 명확하게 작성할 수 없습니다.

시작하기 전에 분석할 로그 구조를 살펴보겠습니다.

127.0.0.1 - - [19/Jun/2012:09:16:22 +0100] "GET /GO.jpg HTTP/1.1" 499 0 "http://domain.com/htm_data/7/1206/758536.html" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; SE 2.X MetaSr 1.0)"
127.0.0.1 - - [19/Jun/2012:09:16:25 +0100] "GET /Zyb.gif HTTP/1.1" 499 0 "http://domain.com/htm_data/7/1206/758536.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; QQDownload 711; SV1; .NET4.0C; .NET4.0E; 360SE)"

이것은 수정된 로그 내용 및 민감한 내용이 삭제되거나 교체되었으나 분석 결과에는 영향을 미치지 않습니다. 물론, Nginx 액세스 로그의 형식은 사용자 정의가 가능하며 회사마다 조금씩 다를 수 있으므로 이해해 주셔야 합니다. 핵심은 스크립트의 내용을 수정하여 자신의 작업에 적용하는 것입니다. 제가 제공한 로그 형식은 단지 참고용일 뿐입니다. 귀하의 회사 서버에서 보는 로그 형식은 확실히 내 로그 형식과 다를 것입니다. 스크립트 작성을 시작합니다

코드를 먼저 게시하고 나중에 설명하겠습니다.

import re
from operator import itemgetter
 
def parser_logfile(logfile):
 pattern = (r''
   '(\d+.\d+.\d+.\d+)\s-\s-\s' #IP address
   '\[(.+)\]\s' #datetime
   '"GET\s(.+)\s\w+/.+"\s' #requested file
   '(\d+)\s' #status
   '(\d+)\s' #bandwidth
   '"(.+)"\s' #referrer
   '"(.+)"' #user agent
  )
 fi = open(logfile, 'r')
 url_list = []
 for line in fi:
  url_list.append(re.findall(pattern, line))
 fi.close()
 return url_list
 
def parser_urllist(url_list):
 urls = []
 for url in url_list:
  for r in url: 
   urls.append(r[5])
 return urls
 
def get_urldict(urls):
 d = {}
 for url in urls:
  d[url] = d.get(url,0)+1
 return d
 
def url_count(logfile):
 url_list = parser_logfile(logfile)
 urls = parser_urllist(url_list)
 totals = get_urldict(urls)
 return totals
 
if __name__ == '__main__':
 urls_with_counts = url_count('example.log')
 sorted_by_count = sorted(urls_with_counts.items(), key=itemgetter(1), reverse=True)
 print(sorted_by_count)

스크립트 설명하자면, parser_logfile() 함수는 로그를 분석하고 일치하는 줄 목록을 반환하는 것입니다. 일반 부분은 설명하지 않습니다. parser_urllist() 함수는 URL을 확인하는 것입니다. get_urldict()키가 동일하면 값이 1 증가하는 사전을 반환하는 함수입니다. 반환되는 사전은 각 URL과 최대 방문 횟수입니다. >함수는 이전에 정의된 함수인 메인 함수를 호출하는 것입니다. 그 부분에서는 지정된 요소별로 정렬할 수 있는 itemgetter에 대해 이야기해 보겠습니다. 예를 들면 url_count()

>>> from operator import itemgetter
>>> a=[('b',2),('a',1),('c',0)] 
>>> s=sorted(a,key=itemgetter(1))
>>> s
[('c', 0), ('a', 1), ('b', 2)]
>>> s=sorted(a,key=itemgetter(0))
>>> s
[('a', 1), ('b', 2), ('c', 0)]

reverse=True 매개변수는 내림차순을 나타냅니다. 즉, 큰 것부터 작은 것까지 정렬, 스크립트 실행 결과:

[('http://domain.com/htm_data/7/1206/758536.html', 141), ('http://domain.com/?q=node&page=12', 3), ('http://website.net/htm_data/7/1206/758536.html', 1)]

nginx 액세스 로그의 Python 정기 분석과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.