Heim >Backend-Entwicklung >Python-Tutorial >Regelmäßige Python-Analyse von Nginx-Zugriffsprotokollen

Regelmäßige Python-Analyse von Nginx-Zugriffsprotokollen

高洛峰
高洛峰Original
2017-02-21 10:46:401349Durchsuche

Vorwort

Das Skript dieses Artikels besteht darin, das Zugriffsprotokoll von Nginx zu analysieren, hauptsächlich um die Anzahl der Besuche auf der Site-URI zu überprüfen. Das Ergebnis der Überprüfung wird bereitgestellt an das Forschungs- und Entwicklungspersonal als Referenz, denn wenn es um die Analyse geht, müssen reguläre Ausdrücke verwendet werden, daher werden Freunde, die noch nie mit regulären Ausdrücken in Berührung gekommen sind, gebeten, ihr eigenes Gehirn zu ergänzen, da es sich um den Inhalt regulärer Ausdrücke handelt. Es ist wirklich unmöglich, darauf einzugehen. Der Inhalt regulärer Ausdrücke ist zu umfangreich und es handelt sich nicht um einen zweiteiligen Artikel.

Bevor wir beginnen, werfen wir einen Blick auf die zu analysierende Protokollstruktur:

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

Dies Der Protokollinhalt und der vertrauliche Inhalt wurden gelöscht oder ersetzt, dies hat jedoch keinen Einfluss auf unsere Analyseergebnisse. Natürlich kann das Format der Nginx-Zugriffsprotokolle angepasst werden, und das ist auch der Fall Der Schlüssel liegt darin, den Inhalt des Skripts zu verstehen und ihn durch Modifikation auf Ihre eigene Arbeit anzuwenden. Ich wette, das Protokollformat, das Sie auf dem Server Ihres Unternehmens sehen, unterscheidet sich definitiv Meins. Siehe Nachdem wir das Protokollformat fertiggestellt haben, beginnen wir mit dem Schreiben unseres Skripts

Ich werde zuerst den Code veröffentlichen und ihn später erklären:

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)

Erläuterung des Skripts, parser_logfile()Die Funktion besteht darin, das Protokoll zu analysieren und eine Liste der übereinstimmenden Zeilen zurückzugeben. Sie sollten nicht erklären, was übereinstimmt Kommentare. Die Funktion von parser_urllist() besteht darin, die besuchte URL des Benutzers abzurufen. Die Funktion get_urldict() besteht darin, ein Wörterbuch mit der URL als Schlüssel zurückzugeben. Wenn die Schlüssel gleich sind, wird der Wert um 1 erhöht ist jede URL und die maximale Anzahl von Besuchen. Die Funktion url_count() besteht darin, die zuvor definierte Funktion aufzurufen. Lassen Sie uns über den Itemgetter sprechen, der nach angegebenen Elementen sortieren kann:

>>> 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-Parameter Gibt die absteigende Sortierung an, d. h. die Sortierung von groß nach klein. Das Ergebnis der Skriptausführung ist:

[('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)]

Weitere Artikel zum Nginx-Zugriffsprotokoll zur regelmäßigen Python-Analyse finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn