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é : 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 18ième 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 visiteur 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 serveur. 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 log 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és 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 :
      • les différents nœuds cachent les pages souvent appelées,
      • des sites miroir peuvent aussi contenir des copies de vos pages, à la demande du propriétaire du site ou à son insu. Une fois qu'une page est publiée, nous ne la contrôlons plus: elle peut être stockée quelque part, et resurgir dans deux ou trois ans. Gênant pour les mises à jour, mais c'est comme cela ;Et naturellement lorsqu'un utilisateur appelle une page, si elle est trouvée dans un cache, c'est cette page qui est fournie, sans que votre serveur (ni son log par conséquent) ne le sache. C'est le but même d'un cache ! De façon caricaturale, plus cela marche, moins vous en saurez:
      • si peu de personnes vous visitent, les caches automatiques du réseau ne contiendront pas vos pages, et vous saurez absolument tout sur les deux ou trois pingoins qui se sont égaré chez vous,
      • si votre site remporte un grand succès, la plupart de vos pages seront en plusieurs copies loin de votre serveur, et le log reflètera de moins en moins l'activité furieuse des foules en délire ;
  • les navigateurs cachent aussi les pages en local. Lorsque le visiteur clique sur "back", c'est en général la copie locale qui est appelée ;
  • la seconde série de critique concerne l'identification du visiteur. Le log ne contient en général que l'URL du visiteur. « 153.109.21.100 » et pas « Casimir Dugenou des Galeries Farfouillettes ». Et il n'est pas possible dans la majorité des cas de remonter de l'URL à l'internaute ou même à la société:
    • la plupart des internautes utilisent des fournisseurs d'accès qui attribuent dynamiquement les adresses IP (pooling). Donc :
      • Un même internaute se connectant à 10 minutes d'intervalle aura en général une adresse IP différente,
      • Laquelle URL peut être utilisée un jour plus tard par une personne différente ;
    • et même si, par chance, il s'agit d'une société ayant un accès direct (un numéro IP fixe), la personne fera partie, par définition, de la société. Oui mais quelle personne ?

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 super-marché: 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'autre mesure de même nature. Un peu comme le remplissage moyen du caddy dans un super marché,
    • il est même possible d'analyser des « profils type »: 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. Seuls la Redoute ou la Fnac peuvent être intéressés 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 sourcil. 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 URLs, le compte du nombre d'URLs différentes ne sert à rien: il minore le nombre réel de visiteur. La contiguité des URLs 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. 4 à 6 semaines, sans garantie. Et brusquement le 3 décembre j'ai eu 80 visiteurs en un jour. A 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'autre 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 3 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 :

  1. IIS.
  2. 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 quel 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 3 utilisateurs ayant passé environ 3 secondes et cherché 15 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…
  • 9 personnes ont consulté mon CV en trois jours. À n'en pas douter, plusieurs chasseurs de tête 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 secondes. Essayez de lire un CV en 0.7 secondes. Chez Compétences, j'ai appris à évaluer professionnellement les gens rapidement. Mais en 0.7 secondes non. Adieu veau, vache, cochon, couvée…
  • quoique. Quoique ! 0.7 ne veut rien dire du tout: peut-être 8 zigs sont entrées 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'auto-dé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 :

 
Sélectionnez
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 URLs, 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 :

 
Sélectionnez
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 URLs 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é au format variable.

Dans ces conditions, la définition du RECORD est la suivante :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

  • : 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 :

 
Sélectionnez
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 milisecondes 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 :

 
Sélectionnez
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
    • 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 ou l'utilisation d'un 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ée) 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'avait 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 tutoriaux 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 ambiguité 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 optenue : 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. A 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 convainquant, 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 bugs que vous trouverez.

VII. Bibliographie et Liens

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 descriptions 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 à : jcolibri@jcolibri.com.