44
55from collections import Counter
66from parse .fichier_log_apache import FichierLogApache
7+ from analyse .filtre_log_apache import FiltreLogApache
78
89
910class AnalyseurLogApache :
@@ -17,24 +18,29 @@ class AnalyseurLogApache:
1718 les statistiques des classements (tops).
1819 """
1920
20- def __init__ (self , fichier_log_apache : FichierLogApache , nombre_par_top : int = 3 ):
21+ def __init__ (self ,
22+ fichier_log_apache : FichierLogApache ,
23+ filtre : FiltreLogApache ,
24+ nombre_par_top : int = 3 ):
2125 """
2226 Initialise un nouveau analysateur de fichier log Apache.
2327
2428 Args:
2529 fichier_log_apache (FichierLogApache): Le fichier à analyser.
30+ filtre (FiltreLogApache): Le filtre à appliquer dans l'analyse. Si une entrée ne
31+ passe pas le filtre, elle ne sera pas pris en compte dans l'analyse.
2632 nombre_par_top (int): Le nombre maximal d'éléments à inclure dans
2733 les statistiques des classements (tops). Par défaut, sa valeur est égale à ``3``.
2834
2935 Raises:
30- TypeError: Si l'argument ``fichier_log_apache`` n'est pas une instance
31- de :class:`FichierLogApache`
32- ou si l'argument ``nombre_par_top`` n'est pas un entier.
36+ TypeError: Les paramètres ne sont pas du type attendu.
3337 ValueError: Si l'argument ``nombre_par_top`` est inférieur à ``0``.
3438 """
3539 # Vérification du type des paramètres
3640 if not isinstance (fichier_log_apache , FichierLogApache ):
3741 raise TypeError ("La représentation du fichier doit être de type FichierLogApache." )
42+ if not isinstance (filtre , FiltreLogApache ):
43+ raise TypeError ("Le filtre à appliquer aux entrées doit être de type FiltreLogApache." )
3844 if not isinstance (nombre_par_top , int ) or isinstance (nombre_par_top , bool ):
3945 raise TypeError ("Le nombre par top doit être un entier." )
4046 # Vérification de la valeur du paramètre
@@ -43,8 +49,22 @@ def __init__(self, fichier_log_apache: FichierLogApache, nombre_par_top: int = 3
4349
4450 # Ajout des données
4551 self .fichier = fichier_log_apache
52+ self .filtre = filtre
4653 self .nombre_par_top = nombre_par_top
4754
55+ def _get_entrees_passent_filtre (self ) -> list :
56+ """
57+ Retourne les entrées qui passent le filtre.
58+
59+ Returns:
60+ list: La liste des entrées qui passent le filtre.
61+ """
62+ entrees_valides = []
63+ for entree in self .fichier .entrees :
64+ if self .filtre .entree_passe_filtre (entree ):
65+ entrees_valides .append (entree )
66+ return entrees_valides
67+
4868 def _get_repartition_elements (self ,
4969 liste_elements : list ,
5070 nom_elements : str ,
@@ -94,19 +114,23 @@ def get_analyse_complete(self) -> dict:
94114
95115 L'analyse suit la structure suivante :
96116 - chemin: chemin du fichier
117+ - total_entrees: voir :meth:`get_total_entrees`
118+ - filtre: filtre appliqué à l'analyse
97119 - statistiques:
98- - requetes:
99- - top_urls: voir :meth:`get_top_urls`
100- - repartition_code_statut_http:
101- voir :meth:`get_total_par_code_statut_http`
120+ - total_entrees_filtre: voir :meth:`get_total_entrees_filtre`
121+ - requetes:
122+ - top_urls: voir :meth:`get_top_urls`
123+ - repartition_code_statut_http: voir :meth:`get_total_par_code_statut_http`
102124
103125 Returns:
104126 dict: L'analyse sous forme d'un dictionnaire.
105127 """
106128 return {
107129 "chemin" : self .fichier .chemin ,
130+ "total_entrees" : self .get_total_entrees (),
131+ "filtre" : self .filtre .get_dict_filtre (),
108132 "statistiques" : {
109- "total_entrees " : self .get_total_entrees (),
133+ "total_entrees_filtre " : self .get_total_entrees_filtre (),
110134 "requetes" : {
111135 "top_urls" : self .get_top_urls (),
112136 "repartition_code_statut_http" : self .get_total_par_code_statut_http ()
@@ -123,9 +147,19 @@ def get_total_entrees(self) -> int:
123147 """
124148 return len (self .fichier .entrees )
125149
150+ def get_total_entrees_filtre (self ) -> int :
151+ """
152+ Retourne le nombre d'entrées qui ont passées le filtre dans le fichier.
153+
154+ Returns:
155+ int: Le nombre total d'entrées.
156+ """
157+ return len (self ._get_entrees_passent_filtre ())
158+
126159 def get_top_urls (self ) -> list :
127160 """
128161 Retourne le top :attr:`nombre_par_top` des urls les plus demandées.
162+ Les entrées prisent en compte sont uniquement celles qui ont passées le filtre.
129163
130164 Returns:
131165 list: Une liste de dictionnaires où chaque clé contient :
@@ -136,14 +170,15 @@ def get_top_urls(self) -> list:
136170 La liste est triée dans l'ordre décroissant du nombre total d'apparitions.
137171 """
138172 return self ._get_repartition_elements (
139- [entree .requete .url for entree in self .fichier . entrees ],
173+ [entree .requete .url for entree in self ._get_entrees_passent_filtre () ],
140174 "url" ,
141175 True
142176 )
143177
144178 def get_total_par_code_statut_http (self ) -> list :
145179 """
146180 Retourne la répartition des réponses par code de statut htpp retourné.
181+ Les entrées prisent en compte sont uniquement celles qui ont passées le filtre.
147182
148183 Returns:
149184 list: Une liste de dictionnaires où chaque clé contient :
@@ -154,6 +189,6 @@ def get_total_par_code_statut_http(self) -> list:
154189 La liste est triée dans l'ordre décroissant du nombre total d'apparitions.
155190 """
156191 return self ._get_repartition_elements (
157- [entree .reponse .code_statut_http for entree in self .fichier . entrees ],
192+ [entree .reponse .code_statut_http for entree in self ._get_entrees_passent_filtre () ],
158193 "code"
159194 )
0 commit comments