Heim >Backend-Entwicklung >Python-Tutorial >Regelmäßige Python-Analyse von Nginx-Zugriffsprotokollen
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!