Maison  >  Article  >  développement back-end  >  Analyse régulière Python des journaux d'accès nginx

Analyse régulière Python des journaux d'accès nginx

高洛峰
高洛峰original
2017-02-21 10:46:401309parcourir

Avant-propos

Le script de cet article consiste à analyser le journal d'accès de nginx, principalement pour vérifier le nombre de visites sur l'uri du site. Le résultat de la vérification sera fourni. au personnel de recherche et développement pour référence, car lorsqu'il s'agit d'analyse, des expressions régulières doivent être utilisées, donc les amis qui n'ont jamais été exposés aux expressions régulières sont invités à compléter leur propre cerveau. Parce que cela implique le contenu des expressions régulières, il est vraiment impossible de développer cela. Le contenu des expressions régulières est trop énorme et ce n'est pas un article en deux parties. L'article peut être écrit clairement.

Avant de commencer, jetons un coup d'œil à la structure du log à analyser :

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

Ceci est modifié Le contenu des journaux et le contenu sensible ont été supprimés ou remplacés, mais cela n'affecte pas nos résultats d'analyse. Bien entendu, le format des journaux d'accès Nginx peut être personnalisé et chaque entreprise peut être légèrement différente, c'est donc le cas. La clé est d'être capable de comprendre le contenu du script et de l'appliquer à votre propre travail en le modifiant. Le format de journal que j'ai donné n'est qu'une référence. Je parie que le format de journal que vous voyez sur le serveur de votre entreprise est définitivement différent de celui-ci. le mien. Voir Après avoir terminé le formatage du journal, nous commençons à écrire notre script

Je publierai d'abord le code et je l'expliquerai plus tard :

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)

Explication du script, parser_logfile()La fonction est d'analyser le journal et de renvoyer une liste de lignes correspondantes. La partie régulière ne sera pas expliquée. Vous devriez savoir à quoi elle correspond en regardant le. commentaires. La fonction de parser_urllist()est d'obtenir à l'utilisateur l'url visitée, la fonction get_urldict() est de renvoyer un dictionnaire avec l'url comme clé. Si les clés sont les mêmes, la valeur est augmentée de 1. Le dictionnaire renvoyé. est chaque URL et le nombre maximum de visites. La fonction url_count() consiste à appeler la fonction définie précédemment, la partie fonction principale, parlons de itemgetter, qui peut trier par éléments spécifiés. Vous pouvez le comprendre avec un exemple :

>>> 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 paramètre Indique un tri décroissant, c'est-à-dire un tri de grand à petit. Le résultat de l'exécution du script :

.

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

Pour plus d'articles sur l'analyse régulière de Python sur le journal d'accès nginx, veuillez faire attention au site Web chinois de PHP !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn