Poor old man log analyzer – juillet 2016

Nous allons voir comment faciliter l’indexaction de votre site par les moteurs de recherche avec l’utilisation d’un sitemap ou plan de site en français.


Si vous gérez votre site internet avec un minimum de rigueur (vous le faites, sinon vous ne me liriez pas en ce moment, n’est ce pas ?), vous utilisez déjà très certainement toute une panoplie d’outils pour savoir ce qui se passe sur le dit site : Google Search Console (anciennement Google Web Tools), Google Analytics, sans doute également divers outils proposés par votre hébergeur, parmi les plus fréquents, on peut noter awStats, Webalizer et bien d’autres encore …

 Si ces outils permettent d’avoir une vue synthétique de l’activité, certains sont trop globalisés (c’est bien de savoir le nombre d’erreurs 404 détectées mais quel intérêt si l’on n’a pas accès au contexte et aux détails ?), d’autres sont extraordinairement fouillés, mais à moins de consulter des dizaines de pages de documentation, impossible de s’y retrouver facilement dans Google Analytics, sauf à en faire son métier.
Alors, une fois encore, je vais vous proposer de mettre les mains dans le cambouis, et de vous ‘fabriquer’ votre outil d’analyse de votre site internet à vous. Chaque serveur internet Apache ou IIS (leur contenu ne diffère que par l’ordre des paramètres et l’ajout pour IIS du code erreur ) met à votre disposition ce que l’on appelle des logs d’activités. Ces logs sont en fait l’enregistrement ligne après ligne de tous les échanges HTTP entrant ou sortant, passant par votre site. Je vous préviens de suite, si vous comptabilisez plusieurs milliers de connexions par jour, ma méthode est clairement sous-dimensionnée par rapport à vos besoins et ne vous satisfera pas. Il existe des tas d’outils, certains payants, d’autres gratuits pour faire la même chose en mieux, à une échelle plus … industrielle, mais l’écrire soi-même est (forcément) plus formateur et motivant.
 
{loadposition abo-magazine}
Bases et Principes.
Que sont donc ces fichiers logs dont je viens de vous parler ? Si vous ignoriez même jusqu’à leur existence, je vous propose de jeter un œil sur la ‘loi’ les concernant. La documentation Apache elle-même, traduite en français sur le site ad-hoc est disponible à cet emplacement : fichiers journaux Apache 2.5. Si le contenu et l’ordre des informations est spécifié de base, votre hébergeur est à même de redéfinir le format d’origine pour l’adapter à ses souhaits et besoins, en configurant le module mod_log_config. La méthode décrite ci-après s’appuie sur les fichiers logs fournis par mon hébergeur : Siteground. Je l’ai validé avec des exemplaires de fichiers journaux HTTP en provenance des hébergeurs 1and1 et OVH, deux des principaux hébergeurs de ‘petits’ sites internet en France. Des journaux en provenance d’autres hébergeurs pourront nécessiter des réglages spécifiques.
La première étape consiste bien entendu à récupérer les fichiers logs en question. Votre hébergeur les fournit en général quotidiennement. Siteground met à ma disposition un fichier journalier et une récapitulation mensuelle des logs d’accès à mon site, des logs d’erreurs et également des logs FTP … ceux qui nous intéressent en l’occurrence sont uniquement les logs d’accès. La méthode pour récupérer les fichiers correspondants, est dépendante de votre hébergeur, en ce qui me concerne une entrée du cPanel me permet de transférer ces fichiers en toute sécurité, mais il est tout à fait possible bien entendu d’aller les chercher via FTP. Siteground les fournissant au format compressé .gz, l’étape suivante consiste évidemment à les décompresser. Ceci étant fait, jeter un œil sur leur contenu est tout aussi évidemment indispensable et … décevant :

Je vous avais prévenu. Tout ce qui entre ou sort de votre site est enregistré à raison d’une ligne par échange au protocole HTTP et pour une seule page affichée, il peut y avoir des dizaines de requêtes et donc de lignes. Il va donc falloir commencer par y mettre de l’ordre car il est absolument impossible de lire le fichier de haut en bas de manière naturelle.
Le contenu.
Comme dit précédemment, pour chaque requête HTTP nous allons trouver une ligne dans le fichier log. Cette ligne est constituée des informations suivantes séparées l’une de l’autre par un espace :

adresse IP à partir de laquelle a été émise la requête
identité (RFC 1413) du client d’origine, peu fiable, l’information est remplacée par mon hébergeur par un tiret
identifiant utilisateur de la personne à l’origine de la requête, remplacée ici aussi par un tiret pour les mêmes raisons
date et heure à laquelle la requête a été reçue et traitée.
la requête elle-même placée entre guillemets
code statut de la requête (200 si tout va bien, 404 pour une donnée non trouvée), la liste des codes peut être trouvée sur le site de la W3C.
taille de l’information retournée au client en nombre d’octets
url du referrer, c’est à dire de la page à l’origine de la requête (votre site si la requête est déclenchée par un lien de menu, ou une url étrangère pour une requête entrante, ou un tiret s’il n’y a pas de referrer). l’information est placée entre guillemets
user-agent du navigateur à l’origine de la requête

Maintenant que nous avons vu ce que mon hébergeur met à ma disposition, il nous reste à voir ce que nous pouvons espérer en faire. Pour répondre à cette question, il nous faut à défaut d’un cahier des charges, à minima une expression de besoins. Si l’on jette à la va-vite les besoins que nous pouvons émettre pour parcourir nos fichiers logs régulièrement, nous pouvons déjà grossièrement dire qu’il est souhaitable de pouvoir :

trier le fichier des accès selon un argument élémentaire en fonction de nos besoins
organiser et ‘lire’ les requêtes selon différents critères variables
extraire rapidement les informations qui nous semblent pertinentes en fonction de nos besoins présents
chercher et trouver les différentes erreurs sur nos pages, les compter et analyser leur contexte
comptabiliser les différentes opérations effectuer par nos utilisateurs et les classifier
rechercher et organiser les accès en fonction des pages cibles parcourues par les utilisateurs
repérer rapidement les ‘fake’, robots connus et autorisés parmi les autres bots
connaître l’origine des appels entrants vers nos pages

Comme point de départ d’une ‘application’ de lecture et traitement des logs Apache, ce n’est déjà pas si mal et nous serons très satisfait de pouvoir y répondre avec des méthodes à la portée de tous (et à ma portée pour commencer).
Il n’y a, à mon sens que deux façons de répondre à cette expression de besoin :

créer une base de données et s’appuyer sur mes articles précédents parlant des requêtes SQL dans Joomla!.
utiliser un outil courant et abordable pour organiser nos données.

Nous allons privilégier la seconde solution et nous appuyer sur Excel pour traiter notre fichier log journalier.
{loadposition abo-magazine}
Retroussons nos manches et au boulot 
Pour répondre à notre expression de besoin, nous allons commencer par ouvrir Excel 2007 et charger notre fichier log de manière standard. (Avec Excel 2003, à quelques restrictions prêt, nous pourrions effectuer la même approche, mais avec des limitations très forte de nombre de lignes à traiter entre autre).

Après avoir sélectionné le fichier dans l’explorateur interne d’Excel et cliqué sur ‘Ouvrir’, remplir l’assistant d’importation avec les options suivantes :
onglet 1/3 de l’assistant : choisir ‘délimité’, Commencer l’importation à la ligne 1 et utiliser le format MS-DOS (PC-8)
onglet 2/3 cocher Espace comme délimiteur, conserver l’option Identificateur de texte est le guillemet (« )
Valider sans modification l’onglet 3/3 et cliquer sur le bouton Terminer

Les colonnes 2 et 3 correspondent aux informations peu fiables d’identification de l’utilisateur et ne présentent aucun intérêt. Plutôt que de les supprimer sans autre forme de procès, nous allons conserver la colonne B et masquer la colonne C (clic-droit sur l’en-tête de colonne puis masquer).
Pour commencer la mise en forme nous allons sélectionner la ligne 1 et insérer une ligne vierge (clic-droit sur l’en-tête de ligne puis Insertion) pour y saisir nos titres de colonnes. Suggestion :
IP (colonne A)
IP (colonne B dont nous motiverons ultérieurement l’usage)
Time (colonne D)
Décalage (colonne E). En théorie, le décalage fait partie de l’information date-heure de la requête, mais le traitement des données basé sur le séparateur ‘espace’ en fait un champ à part entière.
Requête (colonne F)
Status (colonne G)
Longueur (colonne H)
Referrer (colonne I)
User-agent (colonne J)

Nous allons maintenant créer une nouvelle donnée (colonne K), constituée de la concaténation de l’adresse IP (colonne A1) et du User-agent (colonne H1) en effectuant la manipulation suivante :
dans la colonne K1 taper la formule suivante : =CONCATENER(A1; « -« ;H1)
Après avoir validé la formule, la cellule contient désormais le texte : IP-User-agent
Sélectionner avec la souris, la cellule K1 et déplacer le pointeur de la souris vers le bord bas droite de la cellule. Le pointeur de la souris se transforme en signe +, effectuez un double-clic à cet emplacement. La formule ci-dessus est recopiée et calculée instantanément sur toutes les cellules non vides de la colonne K.
La colonne K contient désormais pour chaque ligne, la concaténation du contenu des champs IP et  User-agent de chaque requête HTTP du fichier log. Nous utiliserons cette information comme identificateur unique de chaque source de requête HTTP. Ce sera en quelque sorte notre identifiant de session.

Nous allons également créer une nouvelle donnée (colonne L) en plaçant dans la cellule L1 le libellé Total, dans la cellule L2 la valeur 0. En partant de la cellule L2, nous allons appliquer la même méthode que ci-dessus et dupliquer le contenu de la cellule pour toutes les lignes utiles de la feuille de calcul.
Nous allons maintenant sélectionner en une seule fois les cellules A1 à L1, puis cliquer sur l’onglet Données afin de l’ouvrir et choisir l’opération Trier.
Valider ensuite l’option étendre la sélection (ceci peut être évité en sélectionnant les en-têtes de colonnes A à L à la place des cellules A1 à L1)
Vérifier que la case à cocher Mes données ont des en-têtes est bien cochée, choisir IP-User-agent comme première colonne de tri, cliquer sur Ajouter un niveau (en haut à gauche) et choisir Time comme second critère de tri, valider en cliquant sur OK et attendre que le tableur ait fini de trier les données.

 

Nous avons désormais un fichier log ordonné, mais encore peu lisible et pas vraiment pratique d’utilisation. Nous allons nous efforcer d’y remédier et pour commencer, nous avons deux colonnes IP dont une restée à la valeur – (tiret) d’origine. Améliorons tout cela et rendons cette colonne utile :
Commençons par cliquer dans la cellule B2 pour y recopier la formule : =LIEN_HYPERTEXTE(CONCATENER(« http://ip-lookup.net/index.php?ip= »;A2);A2), ce qui a pour résultat de nous afficher dans la cellule B2, la même adresse IP que celle affichée dans la cellule A2, mais il s’agit cette fois-ci d’un lien hypertexte déclenchant l’appel d’un site internet bien connu avec l’adresse IP concernée en paramètre de l’url.
Reproduisons dans toute la colonne B cette formule de calcul en réutilisant la manipulation décrite au §D-3.
Ceci fait, la colonne A n’a plus aucune utilité (mais ne doit pas pour autant être supprimée : les colonnes B et K y font référence). Nous pouvons la cacher en effectuant un clic-droit sur l’en-tête de la colonne suivi du choix masquer.

Continuons à améliorer notre feuille de calcul et sélectionnons la totalité de nos données, ceci peut être fait de deux manières :
en cliquant sur la petite case en haut à gauche à l’intersection des en-têtes de ligne et des en-têtes de colonnes
en cliquant dans la cellule B1 et en appliquant les combinaisons de touche Ctrl+shift+flèche-basse suivi de Ctrl+shift+flèche-droite

Nos données étant sélectionnées, nous allons maintenant reprendre l’onglet Données et sélectionner l’opération Sous-Total. Dans le formulaire Sous-Total, choisir :
A chaque changement de sélectionner dans la liste : IP-User-agent
Utiliser la fonction : Nombre
Ajouter un sous-total à sélectionner dans la liste : Total
Vérifier que les cases à cocher Remplacer les sous-totaux existants et Synthèse sous les données sont bien cochées
Cliquer sur OK et attendre que Excel ait finit de recalculer la page (S’il y a beaucoup de lignes, cela peut prendre … un certain temps ! Il y a une barre de progression affichée dans la barre de status du tableur)

Excel a généré un plan (cases d’indentations 1 – 2 – 3 à gauche des en-têtes de ligne), ajouté un sous-total à chaque rupture de notre clé unique. Si vous avez pris soin de mettre la ligne 1 en gras – centré, vous devez désormais avoir quelque chose qui ressemble à ceci :

Très gros progrès par rapport au point de départ, n’est ce pas ? Mais pas encore suffisant, nous pouvons aller beaucoup, beaucoup plus loin ! Nous allons régler le problème des totaux à zéro de la colonne L (il s’agit d’un bug de calcul des sous-totaux impossibles lorsque les cellules n’ont pas été initialisées. C’est pour cela que nous avons rempli la colonne de 0 à l’étape §E). Il suffit de cliquer sur l’en-tête de colonne L, choisir Format de cellule puis, dans le formulaire affiché, sélectionner l’onglet Nombre, puis Personnalisée et dans la zone Type, taper précisément : 0;-0;;@ et valider en cliquant sur OK.

La colonne K IP-User-agent qui est notre clé unique de référence, ne nous est plus désormais d’aucune utilité, ou plus exactement ne nécessite pas d’occuper de la place à l’affichage. Nous pouvons également la masquer (clic-droit sur l’en-tête de colonne puis choisir masquer)
Après cette amélioration cosmétique, revenons à notre sujet d’origine. Nous allons cliquer sur le niveau de plan 2, ce qui nous permet d’afficher uniquement les sous-totaux programmés à l’étape §H. Pour améliorer la visibilité que nous en avons, nous allons maintenant mettre ces sous-totaux en évidence :
Sélectionnez les lignes sous-totaux (il n’y a plus qu’elles de visibles, mais les autres sont toujours présentes), en tapant Alt+; (les autres modes de sélection ne fonctionneront pas)
Colorés les lignes sélectionnées de la manière que vous souhaitez : Onglet Accueil, puis choisir une couleur de remplissage à votre convenance et enfin cliquer à nouveau sur le bouton de plan n° 3. Vous devriez voir quelque chose comme :

Ce qui est, il faut le reconnaître déjà beaucoup plus agréable à regarder. Nous approchons de la fin et allons bientôt pouvoir profitez de nos efforts ! Il nous reste à nous accorder la possibilité de sélectionner les informations qui nous intéressent, sélectionnons les cellules A1 à L1 puis l’onglet Données et l’opération Filtrer (ou appliquons la combinaison de touches Ctrl+Maj+L). Excel rajoute des listes de sélection pour chacune des en-têtes de colonnes visibles et pouvons effectuer des recherches sur (par exemple) :
les requêtes en erreur (status = 404) ou en accès non autorisées (status = 403)
tel ou tel type de user-agent
les accès d’url constituées de moins de 5 requêtes (probablement des bots ou des robots plus officiels)
ou tout autre type de sélection de votre choix (toutes les informations sont disponibles dans le fichier journal et à la disposition de votre imagination).

 
 

Ne pas oublier après chaque sélection de restaurer le contenu de la feuille en :
effaçant le filtre
et / ou en sélectionnant à nouveau le niveau de plan 3

Pour notre confort final, il nous reste une étape à accomplir : Sélectionnons l’onglet Affichage, opération : Figer les volets, choix : Figer la ligne supérieure, ce qui nous permettra de toujours garder présent à l’affichage et les titres des colonnes et les sélections disponibles.

Pour aller plus loin …
Je suis bien conscient que pour arriver jusqu’à l’étape finale il faut effectuer un grande quantité d’opérations manuelles. S’il fallait les effectuer chaque jour, ce ne serait pas viable et le jeu n’en vaudrait pas la chandelle. Mais l’avantage avec Excel est que toute opération qui doit être répétée peut être (assez) facilement automatisée sous forme de macro ou de module VBA. Vous allez donc trouver le téléchargement du fichier texte contenant le contenu de la macro VBA permettant de sélectionner le fichier log à traiter et d’automatiser toutes les opérations décrites ci-dessus. Plutôt que de fournir la feuille de macro Excel, j’ai préféré fournir le fichier ASCII correspondant, il vous restera donc à le copier – coller dans une macro à insérer dans votre classeur de macros personnel.
Comme je suis loin d’être un expert en VBA, j’ai abondamment commenté cette macro, il vous sera assez facile de comprendre son fonctionnement, et probablement de l’améliorer en terme de performances. Celles-ci ne sont pas mauvaises au demeurant. Je dispose d’un PC 64 bits tournant sous le système d’exploitation Windows 10 et équipé d’un processeur I7 et de 16 Go de mémoire vive. La macro ci-dessus donne les résultats suivants pour mouliner les fichiers logs :

environ 7 000 lignes : moins de 2 secondes
environ 25 000 lignes : 15 secondes
environ 130 000 lignes : 4 minutes 30 secondes

On voit bien la progression exponentielle du temps d’exécution lié au nombre de lignes du fichier …
Remerciements
Je dois à la vérité de reconnaître que je n’ai pas inventé la méthode décrite ci-dessus. Cette méthode est détaillée en anglais dans une page du blog de Webtrendsoutsider.com datant de 2013, blog affilié plus ou moins à la société Webtrends bien connue dans le monde de l’analyse de logs. J’ai par contre amélioré (un peu) la technique, complété (beaucoup) les informations mises à disposition et écrit en totalité le processus d’automatisation en VBA.