I. Prérequis▲
- logiciel utilisé : Windows 98, Delphi 5.0 ;
- matériel utilisé : Pentium 500Mhz, 128 M de mémoire ;
- champ d'application : Delphi 1 à 6 sur Windows, Kylix ;
- niveau : débutant en Pascal et Delphi ;
- mots clés : programmation Internet - utilitaire de gestion de site - analyse de fréquentation - log HTTP - IIS.
II. Introduction : Analyse de fréquentation▲
Pour analyser la fréquentation de son site, nous disposons de plusieurs outils :
- des compteurs ;
- des scripts ;
- des logs (journaux) du serveur.
II-A. Les compteurs▲
De nombreuses pages comportent des compteurs. L'internaute stupéfait est ainsi informé qu'il est le 18e depuis le 7 mars 1996, ou le 348 798 depuis ce matin. Soit. Quel intérêt pour l'internaute ? Aucun. Strictement aucun. L'auteur du site, en revanche y voit le même intérêt que les bistrots qui s'empressent de vous placer près de la fenêtre pour attirer les autres clients. Il est évident qu'une salle vide incite peu le consommateur à entrer. De la même façon, un site très fréquenté et un logiciel téléchargé des milliers de fois ne peuvent être que bons. Plus importante est la statistique, meilleur est le produit. Ben voyons. Ce type de statistique, facilement modifiable par le propriétaire du site, possède la même fiabilité que la publication par Apple du nombre d'appareils Apple vendus. Et exactement le même intérêt pour le visiteur.
Ces compteurs fonctionnent à partir d'un petit programme qui est exécuté sur le serveur chaque fois que quelqu'un charge la page. Le programme peut être un CGI (en Perl, Python ou autre PHP, JavaScript, etc., ou en Pascal, Delphi).
Si le but est uniquement de connaître la fréquentation, il est possible de rendre le compteur invisible : le programme exécuté sur le serveur incrémente le nombre de visiteurs dans un fichier du serveur, mais ne présente pas la valeur du compteur au visiteur.
C'est la solution que j'étais prêt à utiliser. Sauf que ce type de mécanique se met en branle systématiquement, y compris, et malheureusement pour les pages sauvegardées en local. Chaque fois que vous appelez une page stockée sur votre PC et que le dialogue de connexion Windows s'ouvre, vous avez affaire à un script placé sur la page.
Comme je souhaitais être aussi transparent dans mon analyse que possible, cette solution fut rejetée. Mon souci est de fournir l'information avec le minimum de parasitage pour l'utilisateur. Si je publie, c'est pour être lu, pas pour donner l'impression de flicage aux lecteurs.
II-B. Les logs bruts▲
Il existe une autre solution pour analyser son audience : les logs bruts du serveur. Tous les serveurs industriels (et à fortiori sans doute les serveurs persos) peuvent créer des journaux documentant les appels effectués. Ces logs se trouvent en fait sur tous les types de serveurs. Je me souviens d'avoir crapahuté jadis dans les logs d'Oracle, ou ceux de PerfMon sur Windows NT.
Le contenu et le format des logs varient naturellement avec le type de serveur et peuvent aussi éventuellement être désarmés ou paramétrés par l'administrateur du serveur. Trop de logs dégrade la performance du serveur, pas assez rend la détection d'anomalies difficile, voire impossible.
Il se trouve qu'en ce qui concerne les logs de serveurs HTTP, il existe une norme, qui est celle d'Apache, légèrement modifiée par IIS (Internet Information Server de Microsoft). Nous présenterons le détail du log ci-dessous, mais il contient à l'évidence des informations :
- de date et d'heure ;
- sur le serveur (son adresse) ;
- sur la requête (adresse du visiteur, type de requête, durée, page demandée).
II-C. Les critiques▲
De nombreux logiciels proposent des outils d'analyse des logs. Certains en domaine public, en source, d'autres commerciaux. Tout le spectre allant du gratuit au très cher. Et les plus chers vous expliquent naturellement pourquoi ces outils réaliseront des miracles pour analyser et régler votre site.
C'est pourquoi des personnes plus honnêtes ont écrit plusieurs articles critiquant plus ou moins vivement l'utilité des logs en tant qu'outils d'analyse de fréquentation.
Parmi les critiques, citons :
- tout d'abord, l'utilisation par le Web de caches de pages à de multiples niveaux :
- au niveau du réseau :
II-D. Alors quelle utilité ?▲
Les logs me semblent permettre plusieurs types d'analyses :
-
les indications de « tendance » :
- le niveau global est une première information : 100 par semaine ou 1000 par jour permettent d'évaluer l'efficacité du site,
- même si les caches masquent une partie du trafic réel, les variations restent significatives. Une baisse sur plusieurs mois révèle une désaffection qu'il convient sans doute de corriger ;
-
les statistiques par page :
- elles peuvent indiquer un problème de navigation : une page que vous souhaitez voir utiliser (un bon de commande, par exemple) n'est pas assez visitée. Les statistiques fourniront une indication du problème, mais pas la solution : faut-il changer la page de place, ou améliorer l'attrait du chemin qui y conduit. Un peu comme un supermarché : faut-il mettre le lait à l'entrée ou obliger le chaland à parcourir le magasin en espérant qu'il achètera autre chose ;
-
le cheminement dans les pages :
- certains articles indiquent que 35 % des internautes ne dépassent pas le second clic. Il semble donc fondamental que la première page l'intéresse. Le log peut fournir ici une information précieuse,
- le nombre de pages, le temps passé, le nombre d'octets téléchargés sont d'autres mesures de même nature. Un peu comme le remplissage moyen du caddy dans un supermarché,
- il est même possible d'analyser des « profils types » : ceux qui se précipitent sur les téléchargements, ceux qui regardent les blagues, etc.
Notez que les caches peuvent ici aussi fausser l'information. Si le visiteur clique sur « Back », le log ne le verra pas. Le suivi rigoureux du cheminement dans le site n'est donc pas possible avec le log seul. Et certaines analyses peuvent être poussées au niveau du mouvement de la souris ; mais pas avec les logs, dont ce n'est pas du tout la vocation. Seules la Redoute ou la Fnac peuvent être intéressées par ce type d'analyse. Et lorsque les enjeux sont de cette taille, je pense qu'il est plus efficace d'entasser une vingtaine d'utilisateurs dans une pièce avec des glaces sans tain et une solide équipe de psys derrière guettant leur moindre froncement de sourcils. Technique marketing grand public de base…
II-E. Les autres informations▲
Pour mon premier site sur Free, j'utilisais les statistiques fournies par Free :
- par page, le nombre de visiteurs, le volume ;
- des informations sur le type de navigateur, le type d'OS.
La principale critique de leurs statistiques concerne le nombre de visiteurs et le volume: je n'ai aucune idée de ce qui est mesuré :
-
comment est mesuré le nombre de visiteurs :
- les programmes d'analyse de logs utilisent en général une règle heuristique pour définir un visiteur. Comme les fournisseurs d'accès recyclent les URL, le compte du nombre d'URL différentes ne sert à rien: il minore le nombre réel de visiteurs. La contiguïté des URL est aussi illusoire lorsque le volume augmente, car plusieurs visiteurs font des appels entrelacés. Et la même URL peut alors provenir d'une autre personne. Des règles du style « un visiteur reste connecté 5 minutes en moyenne, donc la même URL au bout de 5 minutes correspond à un autre visiteur ». 5 minutes ? 2 peut-être ? Et pourquoi pas 30 secondes ? En fait le fournisseur souhaite le succès de votre site. Tout chiffre allant dans ce sens ne peut faire que plaisir au client. Il doit donc être examiné avec suspicion,
- mi-octobre, j'avais demandé le référencement de mon site par Alta Vista, Google, etc. Quatre à six semaines, sans garantie. Et brusquement le 3 décembre j'ai eu 80 visiteurs en un jour. À l'évidence l'un de ceux-là était passé par là. Rien dans les statistiques Free ne me signale qu'il s'agit de référenceurs ou d'outils d'analyse automatique et non pas de visiteurs normaux ;
-
le plus grave, et qui fut réellement un des éléments qui m'incita à quitter Free fut l'impossibilité de réconcilier « le jour », « les derniers 7 jours » et « le mois » :
- comme j'avais commencé le site le 10 octobre, « le mois » ne pouvait être que le total de toutes les visites. Que nenni : 12 visiteurs le mercredi, fournissant un total de 0 pour les sept derniers jours. J'imagine qu'ils font une moyenne glissante, Pour glisser, elle glisse, mais comment, ou sur quoi glisse-t-elle : mystère,
- si certaines pages n'étaient pas visitées dans la journée ou la semaine, la ligne disparaît complètement. Il s'agirait donc d'une espèce de loupe sur les derniers jours, sans cumul de tout ce qui s'est réellement passé. Ce qui oblige donc pour récupérer les cumuls réels à télécharger les stats quotidiennes tous les jours et réaliser ses moyennes soi-même. Naturellement il faut alors se connecter tous les jours, retrouver le mot de passe, attendre la réponse, retaper le mot de passe erroné, etc. Bref, une mécanique Minitel Rose des plus classiques.
Quant aux statistiques sur la résolution d'écran, le type de navigateur ou d'OS, je n'y attache pas grande importance :
- mes pages sont construites sans grand effort graphique actuellement. Le réglage au pixel près n'est donc pas utile. De plus je ne contrôle pas ce que le visiteur souhaite utiliser comme navigateur ou sa résolution ;
- le type d'OS me laisse froid : je travaille avec Linux, mais je navigue sous Windows 95. Pour des raisons historiques. D'autres doivent faire de même. La statistique du navigateur ne me fournit pas le type d'OS utilisé pour programmer. Peu d'espoir donc de savoir à partir de ces statistiques s'il vaut mieux écrire des articles pour Windows ou pour Linux. Et de toutes les façons les statistiques sont relativement stables : 98 % de Windows, 2 % de Linux ou autre, et pratiquement jamais de Mac. Et en gros 50 % d'Internet Explorer et 50 % de NetScape. Voilà, tout est dit. Les histogrammes sophistiqués et les camemberts coloriés n'y changeront rien. Et ceci pour les trois ans à venir.
Mentionnons que ce type d'information (résolution, navigateur, OS) n'est PAS dans les logs : il est obtenu par des scripts qui interrogent le visiteur lorsqu'il appelle une page. Une raison de plus, à mes yeux, pour ne pas récupérer ces informations.
II-F. Le format des logs▲
Les logs existent sous deux formats principaux :
- IIS ;
- Common Log Format (Unix / Apache).
Je ne présenterai que le format IIS, mon fournisseur étant sous NT. Ce format ne diffère du format Unix que par la présence du code d'erreur NT et l'ordre des paramètres.
Voici un exemple d'une ligne du log :*
153.109.21.100, -, 09/05/2001, 17:40:33, W3SVC4, S3, 192.168.1.246, 0, 487, 3387, 404, 3, GET, /pfstats/stats.dll/add, idbase=talkMe&idSrv=12&id=125&IDelai=1&rs=1024x768&sc=16&pg=http%3A//www.talkme.net/&ref=,?
La syntaxe est une suite de paramètres séparés par des virgules. Cette ligne comporte actuellement 15 paramètres :
- l'adresse IP de celui qui a effectué la requête ;
- le nom de l'utilisateur. Ce champ n'est documenté que pour les sites exigeant que l'utilisateur s'identifie, ce qui n'est pas le cas de son site ;
- la date ;
- l'heure ;
- le service ;
- le nom du serveur (la machine de mon hébergeur) ;
- l'URL du serveur ;
- le temps écoulé ;
- les octets reçus ;
- les octets envoyés ;
- le code de statut HTTP de la requête (200= OK, pas de problème) ;
- le code de statut NT ;
- la méthode (GET par exemple) ;
- la page visée ;
- les paramètres.
Auraient pu être ajoutés :
- User Agent : permet de détecter si un Spider (programme de visite automatique) a été utilisé ;
- Cookie ;
- Referer : par quel biais la page a été atteinte (via une page « les liens de Dugenou » par exemple).
II-G. Exemple de log brut▲
Pour avoir une idée de la différence entre les logs bruts et les logs filtrés. Voici, à titre d'exemple, quelques lignes extraites du 6 décembre 2001 (le second jour où le site était ouvert). Cette liste est sans intérêt par elle-même, mais pour évaluer ce que les logs peuvent offrir, il faut en avoir vu sur un exemple non trivial (autre qu'une seule ligne type). Voici donc le log brut :
209.73.162.171, -, 06/12/2001, 04:49:12, W3SVC37, S3, 192.168.1.230, 481, 129, 3351, 200, 0, GET, /index.html, -,
209.73.162.171, -, 06/12/2001, 04:49:13, W3SVC37, S3, 192.168.1.230, 481, 151, 4121, 200, 0, GET, /articles/articles.html, -,
209.73.162.171, -, 06/12/2001, 05:08:37, W3SVC37, S3, 192.168.1.230, 260, 138, 2796, 200, 0, GET, /menu.html, -,
213.228.29.10, -, 06/12/2001, 06:08:42, W3SVC37, S3, 192.168.1.230, 961, 288, 3355, 200, 0, GET, /index.html, -,
213.228.29.10, -, 06/12/2001, 06:08:42, W3SVC37, S3, 192.168.1.230, 0, 336, 141, 304, 0, GET, /menu.html, -,
213.228.29.10, -, 06/12/2001, 06:08:42, W3SVC37, S3, 192.168.1.230, 10, 349, 141, 304, 0, GET, /edito/edito_frame.html, -,
213.228.29.10, -, 06/12/2001, 06:08:42, W3SVC37, S3, 192.168.1.230, 0, 339, 140, 304, 0, GET, /ip4.jpeg, -,
213.228.29.10, -, 06/12/2001, 06:08:42, W3SVC37, S3, 192.168.1.230, 0, 365, 141, 304, 0, GET, /edito/edito_top.html, -,
213.228.29.10, -, 06/12/2001, 06:08:43, W3SVC37, S3, 192.168.1.230, 11, 361, 141, 304, 0, GET, /edito/edito.html, -,
66.130.158.58, -, 06/12/2001, 08:12:04, W3SVC37, S3, 192.168.1.230, 361, 370, 3351, 200, 0, GET, /index.html, -,
66.130.158.58, -, 06/12/2001, 08:12:04, W3SVC37, S3, 192.168.1.230, 160, 369, 2796, 200, 0, GET, /menu.html, -,
66.130.158.58, -, 06/12/2001, 08:12:04, W3SVC37, S3, 192.168.1.230, 160, 382, 1982, 200, 0, GET, /edito/edito_frame.html, -,
66.130.158.58, -, 06/12/2001, 08:12:04, W3SVC37, S3, 192.168.1.230, 160, 247, 3414, 200, 0, GET, /ip4.jpeg, -,
66.130.158.58, -, 06/12/2001, 08:12:04, W3SVC37, S3, 192.168.1.230, 180, 402, 1812, 200, 0, GET, /edito/edito_top.html, -,
66.130.158.58, -, 06/12/2001, 08:12:04, W3SVC37, S3, 192.168.1.230, 190, 398, 8459, 200, 0, GET, /edito/edito.html, -,
66.130.158.58, -, 06/12/2001, 08:12:21, W3SVC37, S3, 192.168.1.230, 10, 182, 0, 200, 0, GET, /404.asp, 404;http://www.jcolibri.com/favicon.ico,
66.130.158.58, -, 06/12/2001, 08:13:29, W3SVC37, S3, 192.168.1.230, 180, 456, 2022, 200, 0, GET, /entre_nous/entre_nous_frame.html, -,
66.130.158.58, -, 06/12/2001, 08:13:29, W3SVC37, S3, 192.168.1.230, 170, 477, 1832, 200, 0, GET, /entre_nous/entre_nous_top.html, -,
66.130.158.58, -, 06/12/2001, 08:13:29, W3SVC37, S3, 192.168.1.230, 451, 473, 3358, 200, 0, GET, /entre_nous/entre_nous.html, -,
66.130.158.58, -, 06/12/2001, 08:13:37, W3SVC37, S3, 192.168.1.230, 170, 452, 2006, 200, 0, GET, /articles/articles_frame.html, -,
66.130.158.58, -, 06/12/2001, 08:13:37, W3SVC37, S3, 192.168.1.230, 160, 469, 1824, 200, 0, GET, /articles/articles_top.html, -,
66.130.158.58, -, 06/12/2001, 08:13:37, W3SVC37, S3, 192.168.1.230, 360, 465, 4121, 200, 0, GET, /articles/articles.html, -,
66.130.158.58, -, 06/12/2001, 08:14:17, W3SVC37, S3, 192.168.1.230, 181, 486, 2081, 200, 0, GET, /articles/pascal_to_html/pascal_to_html_frame.html, -,
66.130.158.58, -, 06/12/2001, 08:14:17, W3SVC37, S3, 192.168.1.230, 160, 511, 1953, 200, 0, GET, /articles/pascal_to_html/pascal_to_html_top.html, -,
66.130.158.58, -, 06/12/2001, 08:14:17, W3SVC37, S3, 192.168.1.230, 360, 507, 14557, 200, 0, GET, /articles/pascal_to_html/pascal_to_html.html, -,
66.130.158.58, -, 06/12/2001, 08:15:37, W3SVC37, S3, 192.168.1.230, 170, 488, 2089, 200, 0, GET, /articles/colibri_helpers/colibri_helpers_frame.html, -,
66.130.158.58, -, 06/12/2001, 08:15:37, W3SVC37, S3, 192.168.1.230, 170, 515, 1957, 200, 0, GET, /articles/colibri_helpers/colibri_helpers_top.html, -,
66.130.158.58, -, 06/12/2001, 08:15:37, W3SVC37, S3, 192.168.1.230, 521, 511, 7282, 200, 0, GET, /articles/colibri_helpers/colibri_helpers.html, -,
66.130.158.58, -, 06/12/2001, 08:16:40, W3SVC37, S3, 192.168.1.230, 181, 462, 2046, 200, 0, GET, /presentations/presentations_frame.html, -,
66.130.158.58, -, 06/12/2001, 08:16:40, W3SVC37, S3, 192.168.1.230, 160, 489, 1843, 200, 0, GET, /presentations/presentations_top.html, -,
66.130.158.58, -, 06/12/2001, 08:16:40, W3SVC37, S3, 192.168.1.230, 511, 485, 3096, 200, 0, GET, /presentations/presentations.html, -,
66.130.158.58, -, 06/12/2001, 08:16:52, W3SVC37, S3, 192.168.1.230, 180, 515, 2151, 200, 0, GET, /presentations/soap_et_midas_colibri/soap_et_midas_colibri_frame.html, -,
66.130.158.58, -, 06/12/2001, 08:16:52, W3SVC37, S3, 192.168.1.230, 170, 549, 2001, 200, 0, GET, /presentations/soap_et_midas_colibri/soap_et_midas_colibri_top.html, -,
66.130.158.58, -, 06/12/2001, 08:16:52, W3SVC37, S3, 192.168.1.230, 190, 545, 5711, 200, 0, GET, /presentations/soap_et_midas_colibri/soap_et_midas_colibri.html, -,
66.130.158.58, -, 06/12/2001, 08:17:32, W3SVC37, S3, 192.168.1.230, 180, 460, 2038, 200, 0, GET, /pascalissime/pascalissime_frame.html, -,
66.130.158.58, -, 06/12/2001, 08:17:32, W3SVC37, S3, 192.168.1.230, 160, 485, 1840, 200, 0, GET, /pascalissime/pascalissime_top.html, -,
66.130.158.58, -, 06/12/2001, 08:17:32, W3SVC37, S3, 192.168.1.230, 180, 481, 5286, 200, 0, GET, /pascalissime/pascalissime.html, -,
66.130.158.58, -, 06/12/2001, 08:18:00, W3SVC37, S3, 192.168.1.230, 171, 448, 1990, 200, 0, GET, /livres/livres_frame.html, -,
66.130.158.58, -, 06/12/2001, 08:18:00, W3SVC37, S3, 192.168.1.230, 160, 461, 1816, 200, 0, GET, /livres/livres_top.html, -,
66.130.158.58, -, 06/12/2001, 08:18:00, W3SVC37, S3, 192.168.1.230, 500, 457, 9738, 200, 0, GET, /livres/livres.html, -,
66.130.158.58, -, 06/12/2001, 08:18:07, W3SVC37, S3, 192.168.1.230, 170, 458, 2029, 200, 0, GET, /telecharger/telecharger_frame.html, -,
66.130.158.58, -, 06/12/2001, 08:18:07, W3SVC37, S3, 192.168.1.230, 170, 481, 1835, 200, 0, GET, /telecharger/telecharger_top.html, -,
66.130.158.58, -, 06/12/2001, 08:18:07, W3SVC37, S3, 192.168.1.230, 201, 477, 8620, 200, 0, GET, /telecharger/telecharger.html, -,
66.130.158.58, -, 06/12/2001, 08:18:35, W3SVC37, S3, 192.168.1.230, 190, 486, 2059, 200, 0, GET, /stages/transparents/transparents_frame.html, -,
66.130.158.58, -, 06/12/2001, 08:18:35, W3SVC37, S3, 192.168.1.230, 170, 499, 1936, 200, 0, GET, /stages/transparents/transparents_top.html, -,
66.130.158.58, -, 06/12/2001, 08:18:35, W3SVC37, S3, 192.168.1.230, 371, 495, 5855, 200, 0, GET, /stages/transparents/transparents.html, -,
Vous constaterez que :
-
certaines zones sont sans aucun intérêt :
- le nom utilisateur est toujours « - »,
- le service NT est W3SVC37 et ne change jamais (dans mon cas),
- idem pour la machine qui est S3. Soit,
- idem pour l'URL du serveur 192.168.1.230 ;
- les pages visitées, quasiment la partie la plus utile, comportent tout le chemin de la page demandée.
II-H. Exemple de log filtré▲
En débarrassant ce log d'information sans intérêt pour nous, nous obtenons :
209.73.162.171 |
06 |
04:49: |
481 |
129 |
3351 |
GET index.html |
209.73.162.171 |
06 |
04:49: |
481 |
151 |
4121 |
GET articles.html |
209.73.162.171 |
06 |
05:08: |
260 |
138 |
2796 |
GET menu.html |
213.228.29.10 |
06 |
06:08: |
961 |
288 |
3355 |
GET index.html |
213.228.29.10 |
06 |
06:08: |
0 |
336 |
141 |
GET menu.html |
213.228.29.10 |
06 |
06:08: |
10 |
349 |
141 |
GET edito_frame.html |
213.228.29.10 |
06 |
06:08: |
0 |
339 |
140 |
GET ip4.jpeg |
213.228.29.10 |
06 |
06:08: |
0 |
365 |
141 |
GET edito_top.html |
213.228.29.10 |
06 |
06:08: |
11 |
361 |
141 |
GET edito.html |
66.130.158.58 |
06 |
08:12: |
361 |
370 |
3351 |
GET index.html |
66.130.158.58 |
06 |
08:12: |
160 |
369 |
2796 |
GET menu.html |
66.130.158.58 |
06 |
08:12: |
160 |
382 |
1982 |
GET edito_frame.html |
66.130.158.58 |
06 |
08:12: |
160 |
247 |
3414 |
GET ip4.jpeg |
66.130.158.58 |
06 |
08:12: |
180 |
402 |
1812 |
GET edito_top.html |
66.130.158.58 |
06 |
08:12: |
190 |
398 |
8459 |
GET edito.html |
66.130.158.58 |
06 |
08:12: |
10 |
182 |
0 |
GET *** /404.asp 404;http://www.jcolibri.com/favicon.ico |
66.130.158.58 |
06 |
08:13: |
180 |
456 |
2022 |
GET entre_nous_frame.html |
66.130.158.58 |
06 |
08:13: |
170 |
477 |
1832 |
GET entre_nous_top.html |
66.130.158.58 |
06 |
08:13: |
451 |
473 |
3358 |
GET entre_nous.html |
66.130.158.58 |
06 |
08:13: |
170 |
452 |
2006 |
GET articles_frame.html |
66.130.158.58 |
06 |
08:13: |
160 |
469 |
1824 |
GET articles_top.html |
66.130.158.58 |
06 |
08:13: |
360 |
465 |
4121 |
GET articles.html |
66.130.158.58 |
06 |
08:14: |
181 |
486 |
2081 |
GET pascal_to_html_frame.html |
66.130.158.58 |
06 |
08:14: |
160 |
511 |
1953 |
GET pascal_to_html_top.html |
66.130.158.58 |
06 |
08:14: |
360 |
507 |
14557 |
GET pascal_to_html.html |
66.130.158.58 |
06 |
08:15: |
170 |
488 |
2089 |
GET colibri_helpers_frame.html |
66.130.158.58 |
06 |
08:15: |
170 |
515 |
1957 |
GET colibri_helpers_top.html |
66.130.158.58 |
06 |
08:15: |
521 |
511 |
7282 |
GET colibri_helpers.html |
66.130.158.58 |
06 |
08:16: |
181 |
462 |
2046 |
GET presentations_frame.html |
66.130.158.58 |
06 |
08:16: |
160 |
489 |
1843 |
GET presentations_top.html |
66.130.158.58 |
06 |
08:16: |
511 |
485 |
3096 |
GET presentations.html |
66.130.158.58 |
06 |
08:16: |
180 |
515 |
2151 |
GET soap_et_midas_colibri_frame.html |
66.130.158.58 |
06 |
08:16: |
170 |
549 |
2001 |
GET soap_et_midas_colibri_top.html |
66.130.158.58 |
06 |
08:16: |
190 |
545 |
5711 |
GET soap_et_midas_colibri.html |
66.130.158.58 |
06 |
08:17: |
180 |
460 |
2038 |
GET pascalissime_frame.html |
66.130.158.58 |
06 |
08:17: |
160 |
485 |
1840 |
GET pascalissime_top.html |
66.130.158.58 |
06 |
08:17: |
180 |
481 |
5286 |
GET pascalissime.html |
66.130.158.58 |
06 |
08:18: |
171 |
448 |
1990 |
GET livres_frame.html |
66.130.158.58 |
06 |
08:18: |
160 |
461 |
1816 |
GET livres_top.html |
66.130.158.58 |
06 |
08:18: |
500 |
457 |
9738 |
GET livres.html |
66.130.158.58 |
06 |
08:18: |
170 |
458 |
2029 |
GET telecharger_frame.html |
66.130.158.58 |
06 |
08:18: |
170 |
481 |
1835 |
GET telecharger_top.html |
66.130.158.58 |
06 |
08:18: |
201 |
477 |
8620 |
GET telecharger.html |
66.130.158.58 |
06 |
08:18: |
190 |
486 |
2059 |
GET transparents_frame.html |
66.130.158.58 |
06 |
08:18: |
170 |
499 |
1936 |
GET transparents_top.html |
66.130.158.58 |
06 |
08:18: |
371 |
495 |
5855 |
GET transparents.html |
En examinant ces lignes, vous imaginez sans aucune peine ce que nous pouvons ou non en tirer. Juste quelques commentaires :
- les nouveaux arrivants démarrent en « index.html ». Cela ne sera pas toujours le cas si les utilisateurs conservent des liens vers d'autres pages ;
- une erreur 404 est survenue. Il traîne donc encore des liens erronés. À examiner lorsque l'article sera terminé ;
- certaines pages sont sans intérêt (le jpeg du logo, les frames xxx_frame.html et xxx_top.html).
II-I. Exemple de log analysé▲
À titre d'exemple, voici un exemple simple d'analyse de pages effectué sur le même échantillon :
- il y a eu trois utilisateurs ayant passé environ trois secondes et cherché quinze pages :
Users: |
|
count: |
3 |
time_by_user: |
3,5 |
pages_by_user: |
15,3 |
- ces valeurs globales peuvent se répartir entre pages normales, frames et erreurs :
normal |
19 |
6550 |
( 6,3) |
( 2,2) |
frames |
26 |
3933 |
( 8,7) |
( 1,3) |
errors |
1 |
10 |
( 0,3) |
( 0,0) |
- |
- |
- |
- |
- |
total |
46 |
10493 |
( 15,3) |
( 3,5) |
- en ce qui concerne les pages normales (ni frame, ni erreurs), voici le hit parade :
index.html |
3 |
( 0,6) |
menu.html |
3 |
( 0,1) |
edito.html |
2 |
( 0,1) |
articles.html |
2 |
( 0,4) |
colibri_helpers.html |
1 |
( 0,5) |
pascal_to_html.html |
1 |
( 0,4) |
stages.html |
||
transparents.html |
1 |
( 0,4) |
presentations.html |
1 |
( 0,5) |
soap_et_midas_colibri.html |
1 |
( 0,2) |
pascalissime.html |
1 |
( 0,2) |
livres.html |
1 |
( 0,5) |
entre_nous.html |
1 |
( 0,5) |
telecharger.html |
1 |
( 0,2) |
- |
- |
- |
total_html |
19 |
( 6,6) |
- et pour les erreurs :
Other pages: |
|
*** /404.asp 404;http://www.jcolibri.com/favicon.ico |
1 |
Ces statistiques nous permettent de détecter plusieurs informations :
- notre site comporte des erreurs. Favicon (icône lorsque l'on clique favoris) est d'origine encore inconnue pour moi à ce jour, mais sans grande importance actuellement. On m'a dit depuis qu'ils en avaient tout plein dans la région de Toulouse, mais pas exactement du même type ;
- « 35 % des utilisateurs » à moi ne sont pas partis, eux, au bout d'un clic. Manquerait plus que cela !
- « transparents » a été cliqué sans passer par « stages ». L'examen du log séquentiel montre le saut de « télécharger » à « télécharger les transparents des stages ». Ce que nous avions prévu, et même mis en place. Mais qui est confirmé au bout de deux jours…
Etc., etc., etc. La « logologie » s'acquiert avec le temps, et n'est qu'une question de vieilles casseroles et de bonnes soupes. Allez, encore un exemple :
- j'ai été surpris du nombre de visiteurs consultant mon CV. Celui-ci avait été rédigé, car Becker Avionics (le Dassault allemand) envisageait d'utiliser nos services en programmation Delphi. À tout hasard j'ai donc inclus le CV au site, au cas où les Suédois, les Italiens…
- neuf personnes ont consulté mon CV en trois jours. À n'en pas douter, plusieurs chasseurs de têtes sortant tout droit du bureau de Lagardère ou Arnault allaient me téléphoner dans l'heure ;
- en attendant, j'ai continué à écrire le présent article. J'ai ajouté le cumul de millisecondes par page. Cette valeur devenant trop importante, je l'ai converti en secondes, et divisé par le nombre d'accès. Pour le CV, le résultat fut de 0.7 seconde. Essayez de lire un CV en 0.7 seconde. Chez Compétences, j'ai appris à évaluer professionnellement les gens rapidement. Mais en 0.7 seconde non. Adieu veau, vache, cochon, couvée…
- quoique. Quoique ! 0.7 ne veut rien dire du tout : peut-être 8 zigs sont entrés et sortis sur le champ, et UNE personne, la bonne, a lu, ou récupéré le CV sur son PC pour le lire à tête reposée. Rien n'est donc perdu : ce site s'autodétruira lorsque le téléphone sonnera. D'ici là, et en attendant, la moralité est que les statistiques sont fort utiles, mais leur interprétation exige un peu de bon sens, et encore plus, sans doute, quelques grains d'humour.
III. Utilisation▲
III-A. Compilation▲
Une fois que vous avez vu les logs réels et le type de simplification puis d'analyse, il est enfantin de créer un projet Delphi qui triturera ces logs ad nauseam.
Nous allons simplement présenter ici notre mécanique, fort conscient qu'elle peut être enjolivée sans grande difficulté.
p_http_raw_logs a pour but de permettre :
- la création d'un fichier binaire de stockage de fichiers de log au format IIS ;
- l'ajout de fichiers ASCII contenant des logs IIS (ceux de décembre, de janvier, etc.) ;
- la création de statistiques telles que celles présentées ci-dessus.
Le projet fourni est compilable et fonctionne dans n'importe quel répertoire avec le jeu d'essai fourni. Compilez, exécutez et quittez.
Pour utiliser ce programme avec vos propres logs :
- placez votre fichier de log IIS dans le répertoire exe\data\ ;
- modifiez le nom du fichier dans u_http_raw_logs: k_log_file= 'mes_logs_iis.txt' ;
- compilez ;
- si le fichier binaire n'existe pas encore, cliquez « create_log_ » ;
- ajoutez votre fichier de log en cliquant « append_log_ » ;
- listez le log épuré en cliquant « list_log_ » ;
- présentez quelques statistiques en cliquant « global_stats ».
III-B. Répertoires et directives de compilation▲
L'unité est prévue pour être placée dans :
C:
programs
colibri_utilities
web
http_raw_logs
Vous pouvez naturellement changer cette organisation par Projet | Options | Directories
Les directives de compilation sont :
- R+ (vérification des intervalles) ;
- S+ (vérification de la pile) ;
- pas d'optimisation.
IV. Programmation▲
IV-A. Organisation générale▲
Fondamentalement le programme ne fait qu'analyser un fichier ASCII dont les champs sont délimités par des virgules. Ce format a été adopté par Microsoft pour faciliter l'importation de ces logs par de nombreux outils. J'imagine que Word ou Excel savent faire cela très bien.
Personnellement Word me donne des boutons et je n'ai jamais touché à Excel. De plus Delphi fait cela encore mieux.
Notre programme analyse donc chaque ligne du log et place les informations dans des fichiers disques.
Pour les fichiers, plusieurs options s'ouvraient :
- soit des calculs statistiques directement sur les fichiers ASCII ;
-
soit un stockage des données dans des fichiers binaires, avec calcul de statistiques à partir des fichiers binaires. Et pour le format binaire :
- soit des fichiers FILE ayant le format approprié,
- soit mécanique de base de données telle qu'Interbase.
Pour le moment et pour faciliter la mise au point, j'ai opté pour les FILE. L'organisation est la suivante :
- la classe c_string_file gère les parties variables de chaque ligne (les URL, les noms des pages…) ;
- la classe c_http_raw_logs gère les lignes du log ;
- la classe c_web_page_list calcule les statistiques ;
- le projet p_http_raw_logs est un exemple d'utilisation ;
- l'unité u_strings_html_ analyse les noms des pages et u_display affiche des chaînes dans un tMemo. Ces deux unités classiques ne seront pas détaillées ici (voyez mon site au besoin).
IV-B. u_c_string_file▲
Cette classe place dans un fichier FILE les chaînes de notre log. La structure du fichier est la suivante :
-
pour chaque chaîne :
- un identificateur Integer permettant de retrouver au besoin le RECORD du fichier binaire de log,
- la taille de la chaîne, sous forme d'Integer,
- les caractères de la chaîne ;
- le début du fichier contient 4 octets permettant de gérer une FreeList. Cette partie n'est pas utilisée ici.
L'interface de cette classe est la suivante :
type c_string_file= class
public
m_file: File;
m_file_name: String;
m_first_free_position: Integer;
m_id: Integer;
Constructor create_string_file(p_name, p_file_name: String); Virtual;
function f_force_create: Boolean; Virtual;
function f_open: Boolean; Virtual;
function f_append_string(p_id: Integer; p_string: String): Integer;
function f_read_string(p_string_position: Integer): String;
procedure close_file;
Destructor Destroy; Override;
end;
La plupart des méthodes ont un but évident. Notons que :
- f_append_string : reçoit un identificateur (le numéro de la ligne de log dans notre cas) et la chaîne, et retourne la position du PREMIER octet où est stocké le RECORD ;
- f_read_string : reçoit la position du premier octet, et retourne la chaîne.
IV-C. La classe c_http_raw_logs▲
Cette classe gère le fichier des logs. Elle contient un enregistrement pour chaque ligne de log.
Nous avons à traiter deux types de champs :
- des champs de taille variable : les noms de serveur, les pages demandées ;
- des champs de taille fixe : les durées, les octets envoyés et reçus.
Les champs variables sont placés dans le fichier géré par c_string_file et le fichier du log contient la position de chacun de ces champs dans chacune de ses fiches. Les champs de taille fixe font directement partie du RECORD.
Certains champs pourraient être stockés soit en format variable, soit en format fixe :
- les URL n'ont pas toujours la même taille, mais ne dépassent pas 15 caractères : 123.456.789.012 ;
- les dates et heures pourraient être converties en binaire et stockées en format fixe.
L'objectif de notre programme n'étant pas l'économie de place disque, ces derniers champs ont aussi été stockés au format variable.
Dans ces conditions, la définition du RECORD est la suivante :
type t_string_position= Integer;
t_log_record= record
m_client_ip: t_string_position;
m_user_name: t_string_position;
m_date, m_time: t_string_position;
m_service, m_computer_name: t_string_position;
m_server_ip: t_string_position;
m_elapsed_time, m_bytes_received, m_bytes_sent,
m_status_code, m_windows_status_code: Integer;
m_GET_or_POST: t_string_position;
m_requested_page, m_parameters: t_string_position;
end;
Comme indiqué plus haut, ce RECORD contient deux types de champs :
- les champs tels que m_client_ip qui est la position dans le fichier de taille variable, de la chaine contenant l'URL client ;
- les champs tels que m_elapsed_time, qui contient la valeur numérique du temps de visite.
La classe c_http_raw_logs elle-même a alors la définition suivante :
type c_http_raw_logs= class
public
// -- the variable parts of the log
m_c_string_file: c_string_file;
m_log_file_name: String;
m_log_file: File of t_log_record;
m_log_record: t_log_record;
constructor create_http_raw_logs(p_name, p_file_name: String); Virtual;
function f_force_create: Boolean; Virtual;
function f_open: Boolean; Virtual;
procedure close_file; Virtual;
procedure append_log(p_ascii_file_name: String);
function f_client_ip: String;
function f_date: String;
function f_time: String;
function f_GET_or_POST: String;
function f_requested_page: String;
function f_parameters: String;
function f_requested_page_and_parameters: String;
function f_date_time: tDateTime;
procedure display_record;
destructor Destroy; Override;
end;
Les attributs sont les suivants :
- m_c_string_file: la classe c_string_file qui gérera les chaînes de taille variable ;
- log_file_name, m_log_file et m_log_record: les attributs permettant de gérer les RECORD de taille fixe.
Quelques précisions concernant les méthodes :
-
append_log: se charge de l'ajout d'un nouveau fichier de logs. Cette procédure :
- ouvre les deux fichiers (fixe et variable),
- ouvre et charge le fichier ASCII dans un tampon mémoire,
- analyse toutes les lignes pour les placer dans l'enregistrement binaire,
- referme tous les fichiers ;
- les fonctions f_client_ip, f_date, etc. ont pour seul but d'encapsuler la lecture des champs de taille variable (le programme utilisateur n'a pas besoin de manipuler c_string_file) ;
- f_requested_page_and_parameters et f_date_time: deux fonctions retournant des valeurs qui nous intéressent pour nos états ;
- display_record: la méthode qui produit le log filtré présenté ci-dessus.
IV-D. La classe c_web_page_list▲
Cette unité gère les statistiques par page web. Pour chaque page, elle contient le nombre de visiteurs, le temps passé à scruter la page, etc.
Pour cumuler les informations, il suffit de balayer le fichier binaire c_http_raw_logs en appelant add_or_increment.
Techniquement la mécanique de statistique est organisée sous forme d'une tStringList encapsulée :
- c_web_page_list contient une tStringList avec le nom de la page ('initiation_delphi.html' par exemple) ;
- chaque Item de la tStringList contient un pointeur vers un objet de type c_web_page qui contient les informations qui nous intéressent pour chaque page: nombre de visites, etc.
La programmation de cette unité a donc démarré par le squelette,u_c_tstringlist qui a été adapté au traitement à l'analyse du log.
IV-D-1. c_web_page▲
La définition de la classe c_web_page est la suivante :
c_web_page= // one "web_page"
Class
public
m_c_parent_web_page_list: c_web_page_list;
m_web_page_name: String;
m_web_page_count: Integer;
m_elapsed_time: Integer;
m_used: Boolean;
m_last_date: tDateTime;
Constructor create_web_page(p_name, p_web_page_name: tring;
p_c_web_pages: c_web_page_list; p_elapsed_time: Integer; p_last_date: tDateTime); Virtual;
function f_display_web_page: String;
Destructor Destroy; Override;
end;
Les attributs sont :
- m_c_parent_web_page_list: pointeur de la page individuelle vers la liste des pages (est utilisé ici pour calculer la taille maximale des noms afin de pouvoir aligner les colonnes de l'affichage) ;
- m_web_page_name: le nom de la page ;
- m_web_page_count: le nombre de références à cette page ;
- m_elapsed_time: le cumul de millisecondes passées sur cette page ;
- m_used : permet de récupérer les pages non analysées.
Et pour les méthodes :
- create_web_page: construit l'objet et initialise les attributs ;
- f_display_web_page : une chaîne d'affichage typique.
IV-D-2. c_web_page_list▲
Cette classe encapsule donc la tStringList des pages.
La définition de la classe c_web_page_list est la suivante :
c_web_page_list= // "web_page" list
Class
public
m_c_web_page_list: tStringList;
m_max_web_page_length: Integer;
Constructor create_web_page_list(p_name: String); Virtual;
function f_web_page_count: Integer;
function f_c_web_page(p_web_page: Integer): c_web_page;
procedure add_web_page(p_c_web_page: c_web_page);
procedure add_or_increment(p_web_page_name: String; p_elapsed_time: Integer;
p_last_date: tDateTime);
procedure display_web_page_list;
procedure display_indented_html(p_site_map_name: String);
procedure display_unused;
Destructor Destroy; Override;
end;
Les attributs sont :
- m_c_web_page_list: la tStringList ;
- m_max_web_page_length: calcule la taille maximale des noms de page (pour aligner les valeurs numériques à droite des noms).
Et pour les méthodes :
-
pour la partie standard de gestion de tStringList :
- create_web_page_list : crée l'objet,
- f_web_page_count : encapsule le nombre d'éléments,
- f_c_web_page : encapsule l'accès par indice à un élément,
- add_web_page : encapsule l'ajout d'un élément,
- add_or_increment : crée un nouvel élément ou incrémente les statistiques d'une page ayant déjà été ajoutée ;
-
et finalement la récupération des résultats :
- display_web_page_list : la liste sans fioritures,
- display_indented_html et display_unused : affichage des tables présentées ci-dessus.
Seules les deux dernières procédures méritent quelques explications :
- parmi les reproches que je faisais aux logs Free figure l'absence d'ordre de présentation. Les pages étaient en vrac. Or mon site est organisé en répertoires (les stages, les articles, etc.). Je souhaitais une présentation des statistiques correspondant à cette organisation ;
-
pour cela je place sur disque un fichier ASCII indenté contenant la structure des répertoires. Un simple balayage des répertoires par FindFirst ou l'utilisation d'un tDirectoryListBox ne font pas l'affaire, car DOS présente les répertoires dans l'ordre qui lui fait plaisir. Et qui ne me fait en général pas plaisir à moi. Un utilitaire place l'arborescence dans un fichier ASCII que je réorganise à la main. C'est même un peu plus compliqué que cela :
- Site_editor, mon outil de construction de site, utilise un tTreeView pour créer ou gérer les répertoires. L'arborescence est sauvegardée dans un fichier ASCII,
- un utilitaire relit ce fichier de répertoires, et construit un fichier ASCII de pages .HTML. En effet certains répertoires contiennent plusieurs pages (les Index Pascalissime, par exemple) ;
Quoi qu'il en soit, l'ordre dans lequel je souhaite voir mes statistiques est défini par le fichier site_map_html.txt, qui a été placé dans le .ZIP du projet pour vous permettre de faire fonctionner notre exemple ; - la procédure display_indented_html charge ce fichier ASCII dans une tStringList locale, et pour chaque nom récupère de m_c_http_raw_log_page_list les statistiques qui nous intéressent ;
- pour chaque page « normale » analysée, la propriété m_used est basculée à True. Pour récupérer les pages que nous n'avions pas anticipées (essentiellement les erreur 404), il suffit de parcourir m_c_http_raw_log_page_list à la recherche de pages pour lesquelles m_used est False.
V. Améliorations▲
V-A. Quelques suggestions▲
Citons en vrac :
- incorporer les informations « User-Agent » : qui permettrait de détecter les moteurs automatiques de visite de pages ;
- effectuer le même type d'analyse pour les logs FTP : pour le moment mon hébergeur ne me les fournit pas, car ils sont sur une machine séparée et qui regroupe le FTP de tous les sites. Je finirai peut-être par les obtenir un jour ;
- l'utilisation d'Interbase (ou toute autre base de données) au lieu des fichiers binaires utilisés ici.
V-B. L'hébergeur▲
Lorsque je me suis finalement décidé à monter un site, la première difficulté a été le choix de l'hébergeur.
- Plusieurs personnes m'avaient déjà proposé d'héberger Pascalissime, mais je ne suis pas arrivé à me décider.
- En espérant trouver une aide « personnalisée », je me suis tourné vers Lolo qui fréquentait les « Mercredis de l'Institut Pascal ». Ancien programmeur émérite, administrateur en tant qu'étudiant du site de Jussieu, il travaille actuellement chez un hébergeur professionnel. Il m'a fait comprendre qu'ils ne pouvaient pas laisser leur client gambader en CGI dans leurs systèmes, à moins d'allouer une machine dédiée à ce client chez eux. Et les machines sont des systèmes spécialisés en racks : rien à voir avec un PC de chez Carrefour ou Conforama. Je n'ai même pas demandé le prix qui n'a certainement non plus rien à voir. Alors, dégoûté, je suis retourné hiberner deux ans de plus.
- Alain Guérin m'avait présenté Free. Enfin un truc gratis à ma portée. J'ai été très satisfait de leur prestation. Le mail a fort bien marché, et fonctionne encore à ce jour. Alain avait par la suite insisté qu'il était possible, ainsi que chez d'autres hébergeurs style Club Internet, d'avoir des pages web « perso ». J'ai commencé à regarder, et suis tombé sur des tutoriels PHP. Allons donc, encore un langage de plus à la syntaxe approximative et fluctuante. J'ai plus que donné à ce niveau, et je me suis arrêté là.
-
Lorsque je me suis réellement décidé à enfin faire quelque chose, j'ai commencé par analyser les pages des autres programmeurs. Pas beaucoup de PHP, JavaScript ou autre Python me semblait-il. C'est là que j'ai basculé. Le site fut monté en un mois en écrivant le texte HTML avec Notepad. Pas réellement, mais enfin, presque. À ce jour (18 décembre 2001), près de 4 Megs de pages HTML et de .ZIP téléchargeables. Et au bout de 15 jours, les limitations de Free apparurent :
- des statistiques difficilement exploitables,
- pas de CGI. Du Perl ou PHP si j'ai bien compris, mais cela n'est pas de mon goût,
- un statut juridique peu clair: peut-on mentionner des prix, des bons de commande ? Sans doute compte tenu de leur volume ils ne vérifient pas tout, et peut-être même ferment-ils les yeux. Mais cette ambiguïté aurait été, pour le moins, inconfortable,
-
un service, malgré tout minimal. Gratuit certes, mais minimal :
- pour les réponses au téléphone, 7 jours sur 7 et 24 heures sur 24, une mécanique du style « pour avoir les tarifs, tapez sur 1 », etc. Et après avoir tapé comme un malade au point d'en attraper un furoncle au doigt (j'imagine qu'ils touchent des sous des PTT comme le Minitel Rose), le message classique « tous nos techniciens sont occupés, veuillez appeler ultérieurement »,
- patience et ténacité font plus que force et rage : au bout de plusieurs appels je tombe enfin sur quelqu'un. Très aimable et courtois, je dois dire. Mais plutôt commercial ou « grand public ». Trouver le fichier correspondant à un compteur invisible que j'avais placé sur une de mes pages n'était pas dans son domaine de compétence. Il est évident que ce n'est pas le genre de question posée par « la ménagère de plus de 50 ans ». Il m'aiguille vers un mail technique,
- mail fut envoyé. Réponse fut obtenue : 9 jours plus tard, et « veuillez nous dire sur quelle page est le compteur ». La réponse n'est pas idiote : il allait vérifier mon bout de script, et regarder s'il trouvait le fichier .DAT quelque part, j'imagine.
À ce moment j'avais tout de même un peu perdu patience, et commencé à regarder ailleurs ;
- c'est là que je suis tombé sur www.plusfacile.com. Plusieurs anciens lecteurs rencontrés lors de la conférence Borland 2000 m'avaient chaudement recommandé VienneInfo, Développez, Delphinautes, etc. Et sur ce site j'ai trouvé les coordonnées de PlusFacile. La proposition semblait alléchante: avec des CGI. Et Interbase. Et en Delphi. Oui monsieur. Quelques coups de fil. Comme je bataillais avec les stats Free, j'ai posé la question des logs bruts. Un peu d'étonnement. Apparemment j'étais le premier à avoir ce type de besoin saugrenu. Mais c'était possible: les logs étaient générés par IIS pour gérer le site, et il suffisait de créer un alias pour me permettre de récupérer « mes » logs. J'ai craqué au bout de deux jours et envoyé la commande et le chèque. À titre d'information, je paie de l'ordre de 3000 francs par an pour deux sites avec réservation du nom de domaine. Moins que ma facture de téléphone. Mais voyez le détail de l'offre par vous-mêmes : il y a des offres « personnelles », « gold », etc. Depuis, j'ai appelé PlusFacile quatre ou cinq fois. J'ai toujours eu le patron au téléphone au bout de trois ou quatre sonneries, y compris le samedi matin ou dimanche après-midi. Les mails sont répondus dans la journée. Des exemples de programmation Web en source Delphi dans le quart d'heure suivant le coup de fil…
Le plus drôle est que si cet article est convaincant, PlusFacile sera inondé de demandes d'autres clients pour obtenir leurs logs bruts. PlusFacile et surtout les autres j'espère. Lesquels n'en auront pas toujours envie. En général pas envie du tout même. Parlez-leur alors de CGI. Et en Delphi. Si, si, parfaitement : de CGI en Delphi. Et écoutez la réponse. Ensuite, il vous suffira de cliquer sur.http://www.plusfacile.com.
VI. Télécharger le source▲
Le projet test_http_raw_logs.zip(17 K) contient :
- les unités nécessaires à la compilation de ce projet ;
- le petit fichier d'exemple de log brut présenté dans cet article ;
- le fichier ASCII qui définit l'ordre dans lequel je souhaite voir les pages présentées ;
- le projet de démonstration lui-même.
Avec les mentions d'usage :
- j'apprécie tous les commentaires, remarques ou critiques ;
- signalez-moi les bogues que vous trouverez.
VII. Bibliographie et Liens▲
-
Why web usage statistics are (worse than) meaningless - Jeffrey GOLDBERG :
- 18 mai 2001 ;
- Vous explique pourquoi cet article est sans aucun intérêt :-).
-
- July 1999 ;
- le ban et l'arrière-ban d'outils d'analyse.
-
Analyzing Log Files- Cliff WOOTON :
- article général ;
- autre lien vers le même: firewalls, IDS & Hacking - Log analysis. How yo set up a comprehensive statistics and monitoring service - Analyzine Log Files.
-
ANALOG 5.03: How the web works - Stephen TURNER ;
- 7 july 2001 ;
- partie de la doc ANALOG.
-
Measuring Web Site Usage: Log File Analysis - Susan HAIGH and Janette MEGARITY :
- Aug 4 1998 ;
- article général avec d'autres références et des liens vers des outils.
-
ch 22 - Monitoring Web Server Activity - Mike STARKENBURG :
- chapitre de démo du livre: Unix Unleashed, Internet edition, Sams.
-
Lesson 8 - Web Site Analysis :
- des transparents d'un cours sur le sujet.
-
The database Webhouse Toolkit: Building tbe Web Enabled Data Warehouse - Ralph KIMBAL, Richard METZ :
- Chapter 4: Understanding the Clickstream as a Data Source ;
- John Wyley - 2 2000 - ISBN 0471 376 809 ;
- chapitre démo sur le web.
-
Using Web Server Logs to Improve Site Design - Carl DROTT utilisation des logs, Common Log Format ;
- le format CLF.
VIII. L'auteur▲
John COLIBRI est surtout intéressé par la programmation en Pascal, Delphi et Kylix.
Son site: http://www.jcolibri.com contient des articles tels que celui-ci avec les sources, la description de ses livres (tous les programmes sont téléchargeables), l'index du magazine Pascalissime, le programme des stages de formation Pascal et Delphi qu'il anime (les transparents sont téléchargeables).
Vous pouvez le joindre par mail à : .