-
Notifications
You must be signed in to change notification settings - Fork 0
/
AnalyseLog.cpp
294 lines (242 loc) · 8.18 KB
/
AnalyseLog.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
/*************************************************************************
AnalyseLog - Classe qui analyse le fichier log Apache
-------------------
début : 21/01/2019
copyright : (C) Mathéo ATCHE et Andréa CROC
e-mail : [email protected] et [email protected]
*************************************************************************/
//---------- Réalisation de la classe <AnalyseLog> (fichier AnalyseLog.cpp) ------------
//---------------------------------------------------------------- INCLUDE
//-------------------------------------------------------- Include système
#include <iostream>
using namespace std;
#include<set>
#include<string>
//------------------------------------------------------ Include personnel
#include "AnalyseLog.h"
#include "LectureLog.h"
//------------------------------------------------------------- Constantes
//----------------------------------------------------------------- PUBLIC
//----------------------------------------------------- Méthodes publiques
void AnalyseLog::RemplirMap (bool e, bool t,int heure)
// Algorithme : Remplit la map de la classe AnalyseLog
//selon les options d'exécution e (extension document),
//t (heure requête)
{
// Conteneur Suffixe contenant la liste des suffixes que l'on
//ne souhaite pas si l'option e est true
set<string>Suffixe {"php","css","jpg","gif","ico","png","jpeg","ics"};
LectureLog lect;
while(!file.eof())
{
bool check=true;
lect.LireLigneFichierLog(file);
if(e)
{
//On recupère la position du point
int pos=lect.ligneFichier.url.find_last_of(".");
//cout << pos;
string suf;
if(pos!=-1)
{ //On recupère la chaine de caracteres qui se trouve après le point
suf = lect.ligneFichier.url.substr(pos + 1);
//cout << suf << endl;
//Si l'extension du document est dans Suffixe
if(Suffixe.find(suf)!=Suffixe.end())
{
check=false;
}
}
}
if(t && check)
{
int h = atoi(lect.ligneFichier.date.substr(12, 2).c_str());
//Si l'heure de la requête ne correspond pas à celle attendue
if(h!=heure)
{
check=false;
}
}
if(check)
{
//Si l'url de la ligne lu n'est pas present dans le graphe
if (graphe.find(lect.ligneFichier.url) == graphe.end())
{
//On crée une map avec le referer et 1 car c'est la première fois
//qu'on trouve l'url et donc le referer vers cet url
map<string, int> reference;
reference.insert(make_pair(lect.ligneFichier.referer, 1));
//On cree une paire avec la map precedente et le nombre total de reference a l'url
//qui est pour le moment de 1
pair<map<string, int>, int> pref(reference, 1);
//On insère la paire dans le graphe
graphe.insert(make_pair(lect.ligneFichier.url,pref));
}
//Si l'url de la ligne lu est déja présent dans le graphe
else
{
StructGraphe::iterator itRef;
itRef = graphe.lower_bound(lect.ligneFichier.url);
//Si le referer de la ligne lu est déja présent dans la map de l'url du graphe
if (itRef->second.first.find(lect.ligneFichier.referer) != itRef->second.first.end())
{
map<string, int>::iterator itNb;
itNb = itRef->second.first.lower_bound(lect.ligneFichier.referer);
//On incrémente le nombre de fois qu'on a fait
//la requete depuis ce referer vers l'url
itNb->second = itNb->second + 1;
//On incrémente le nombre total de fois qu'on a fait une requete vers cet url
itRef->second.second = itRef->second.second + 1;
}
//Si le referer de la ligne lu n'est pas présent dans la map de l'url du graphe
else
{
//On insère le referer et 1 car c'est la premiere fois
//qu'on trouve une requête depuis ce referer vers l'url
itRef->second.first.insert(make_pair(lect.ligneFichier.referer, 1));
//On incrémente le nombre total de fois qu'on a fait une requete vers cet url
itRef->second.second = itRef->second.second + 1;
}
}
}
}
} //----- Fin de RemplirMap
void AnalyseLog::GenererGraphe(bool g, string nomFichier)
// Algorithme : Génerer un fichier .dot en écrivant dedans
// la description textuelle du graphe avec comme noeud les
// url et referer et des arcs représentant les liens entre
//les referers et les url avec le nombre de hits sur les arcs
{
if (g)
{
//Tester si ouverture fichier ok
ofstream fichier(nomFichier.c_str());
fichier << "digraph {" << endl;
//Itérateurs sur le debut et la fin de la map de map
StructGraphe::const_iterator debutG, finG;
debutG = graphe.begin();
finG = graphe.end();
//Itérateurs sur le début et la fin de la map avec referer et hit
map<string, int>::const_iterator debR,finR;
//Map contenant le nom de l'url ou referer et le numéro du noeud
map<string,int>node;
//Numéro des noeuds
int compteur=0;
while (debutG != finG)
{
debR = debutG->second.first.begin();
finR = debutG->second.first.end();
//Si l'url n'est pas déjà un noeud
if (node.find(debutG->first) == node.end())
{
//On représente les noeuds
fichier << "node" <<compteur<<" [label=\""<<debutG->first << "\"];" << endl;
node.insert(make_pair(debutG->first,compteur));
compteur++;
}
while (debR != finR)
{
//Si le referer n'est pas déjà un noeud
if (node.find(debR->first)==node.end())
{
//On représente les noeuds
fichier << "node" <<compteur<<" [label=\""<<debR->first << "\"];" << endl;
node.insert(make_pair(debR->first,compteur));
compteur++;
}
debR++;
}
debutG++;
}
//On remet l'itérateur au début
debutG = graphe.begin();
while (debutG != finG)
{
debR = debutG->second.first.begin();
finR = debutG->second.first.end();
while (debR != finR)
{
//On décrit les liens entre url et referer
fichier<<"node"<<node.find(debR->first)->second<<" -> "<<"node"<<node.find(debutG->first)->second<<" [label=\""<<debR->second<<"\"];" << endl;
debR++;
}
debutG++;
}
fichier << "}" << endl;
cout << "Dot-file " << nomFichier << " generated" << endl;
}
}//----- Fin de GenererGraphe
void AnalyseLog ::AfficherTop10(ostream & os)
{
StructGraphe::const_iterator debut, fin;
fin = graphe.end();
set<string>listeMax;
//On cherche le top 10
for (int i = 0; i < 10; i++)
{
debut = graphe.begin();
bool existe = false;
int hitmax = 0;
string url="";
while (debut != fin)
{
//Si le nombre total de réferences à l'url est supérieur au max
//et l'url n'a pas déjà été affiché
if (debut->second.second > hitmax && listeMax.find(debut->first) == listeMax.end())
{
hitmax = debut->second.second;
url = debut->first;
existe = true;
}
debut++;
}
//Pour sortir de la boucle si il y a moins de 10 documents dans la map
if (!existe)
{
break;
}
os << url << " (" << hitmax << " hits)"<<endl;
listeMax.insert(url);
}
}
//------------------------------------------------- Surcharge d'opérateurs
//AnalyseLog & AnalyseLog::operator = ( const AnalyseLog & unAnalyseLog )
// Algorithme :
//
//{
//} //----- Fin de operator =
//-------------------------------------------- Constructeurs - destructeur
//AnalyseLog::AnalyseLog ( const AnalyseLog & unAnalyseLog )
// Algorithme :
//
/*{
#ifdef MAP
cout << "Appel au constructeur de copie de <AnalyseLog>" << endl;
#endif
} *///----- Fin de AnalyseLog (constructeur de copie)
AnalyseLog::AnalyseLog (string fic,bool g, bool e, bool t, string nomFic,int heure)
// Algorithme :
//
{
file.open(fic);
while (!file)
{
throw "Erreur, le fichier log indiqué n'existe pas ou n'est pas accessible en lecture";
}
RemplirMap(e,t,heure);
GenererGraphe(g,nomFic);
AfficherTop10();
#ifdef MAP
cout << "Appel au constructeur de <AnalyseLog>" << endl;
#endif
} //----- Fin de AnalyseLog
AnalyseLog::~AnalyseLog ( )
// Algorithme :
//
{
#ifdef MAP
cout << "Appel au destructeur de <AnalyseLog>" << endl;
#endif
} //----- Fin de ~AnalyseLog
//------------------------------------------------------------------ PRIVE
//----------------------------------------------------- Méthodes protégées