o
[
>
@
/
.
}

NOUS LES DEVS

Tail

Inspecter des logs en temps réel

Niveau : débutant(e)
</> </> </>

Tail

Tail est une commande qui permet d’afficher les dernières lignes d’un fichier. Elle est vraiment une incontournable, que ce soit en cours de développement ou directement en production. Notamment pour analyser des logs et faire du monitoring.

Simple

Pour afficher les dernières lignes de mon fichier de log, voici la commande à utiliser. Un tail suivi du nom du fichier.

tail error_log

Temps réel

Avec le flag -f, je vais pouvoir visualiser en temps réel les nouvelles lignes s’ajouter à la fin du fichier et voir les logs défiler. C’est pratique pour ne pas devoir relancer un tail à chaque fois. Selon moi c’est l’option la plus intéressante de cette commande et là où tail va être le plus intéressant.

tail -f error_log

Exploiter tail en PHP

En PHP, la fonction error_log te permet d’écrire directement dans le fichier de log. Le premier paramètre est le message qu’on veut écrire. Le second argument est un nombre qui correspond au type de message. 3 est la valeur qui permet d’ajouter le message à la fin du fichier.

<?php

   error_log("Bienvenue sur nouslesdevs", 3);

À la fin de mon fichier de log, voici ce qui apparaît :

Bienvenue sur nouslesdevs

Couplé à la commande tail, ça me permet de détecter si mon code passe bien dans une fonction ou d’obtenir du log pour du traitement de masse, comme par exemple des imports de produits que je peux faire pour des eShops que je développe et qui prennent souvent plusieurs dizaines de minutes.

<?php

   $nbr_produit = count($products);

   foreach( $products as $key => $product ){
      error_log("Traitement $key/$nbr_produit\n",3);
      // reste du script qui met à jour les produits
   }

C’est très pratique de suivre la progression de la mise à jour des produits dans la console, surtout quand on parle de plusieurs milliers d’éléments.

Traitement 1/2500
Traitement 2/2500
Traitement 3/2500
Traitement 4/2500
Traitement 5/2500
Traitement 6/2500

Grep

Le second élément et le plus puissant avec tail, c’est le fait que l’on va pouvoir filtrer la sortie en l’associant à la commande grep. Pour brancher grep à tail, on va utiliser un pipe (le symbole « | ») qui permet de renvoyer le résultat d’une commande à une autre commande.

Pour te montrer un cas d’usage typique, voici d’abord le résultat d’un tail sur le fichier access_ssl_log de mon site web.

tail -f access_ssl_log
218.15.229.80 - - [19/Feb/2023:10:51:57 +0100] "POST /wp-admin/post.php?post=10314&action=edit HTTP/1.0" 302 701 "https://nouslesdevs.com/wp-admin/post.php?post=10314&action=edit" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
218.15.229.80 - - [19/Feb/2023:10:51:57 +0100] "GET /wp-admin/post.php?post=10314&action=edit&message=4 HTTP/1.0" 200 113631 "https://nouslesdevs.com/wp-admin/post.php?post=10314&action=edit" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
218.215.229.80 - - [19/Feb/2023:10:51:58 +0100] "GET /robots.txt HTTP/1.0" 200 713 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
218.15.229.80 - - [19/Feb/2023:10:51:58 +0100] "GET /cli/tail/ HTTP/1.0" 200 12432 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
218.15.229.80 - - [19/Feb/2023:10:51:58 +0100] "GET /robots.txt HTTP/1.0" 200 713 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
218.15.229.80 - - [19/Feb/2023:10:52:03 +0100] "POST /wp-admin/admin-ajax.php HTTP/1.0" 200 870 "https://nouslesdevs.com/wp-admin/post.php?post=10314&action=edit" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"
218.15.229.80 - - [19/Feb/2023:10:52:08 +0100] "POST /wp-admin/admin-ajax.php HTTP/1.0" 200 870 "https://nouslesdevs.com/wp-admin/post.php?post=9063&action=edit" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36"

Je veux maintenant détecter les erreurs 404 afin d’identifier un potentiel problème. Et bien, je peux écrire mon tail comme ci-dessus en le faisant suivre d’un pipe (|), ce qui va tout envoyer à la commande grep, qui elle va se charger de filtrer en fonction d’un mot que je rajoute.

tail -f access_ssl_log | grep 404

En sortie, grâce à la combinaison des deux commandes, je n’aurais que les lignes qui contiennent au moins 404. Si je vais volontairement sur une page qui n’existe pas, je peux voir qu’il n’y a que cette ligne qui ressort en console.

218.15.229.80 - - [19/Feb/2023:10:56:56 +0100] "GET /cli/article_bidon HTTP/1.0" 404 50423 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/109.0"

Sur un site qui génère beaucoup de trafic, ça sera obligatoire sinon tu ne pourras absolument rien suivre en console tellement le défilement sera rapide.

Fin

Voilà mes principaux usages de la commande tail, une commande que je place dans mon top 10 de celles que j’utilise le plus. Et qui pourtant n’a qu’un seul rôle, afficher la fin d’un fichier.

10/07/2023

Yann Vangampelaere - nouslesdevs -

NOUS LES DEVS

Vous aimez ce que je fais ? Vous voulez que j'en fasse plus ? dans le développement du blog.