Lorsque je fais une nouvelle application avec le framework Laravel, surtout dans la phase de développement active, j’aime bien suivre tout ce qu’il se passe dans les moindres détails. Dans mes projets, j’utilise énormément les commandes de Laravel, elles font divers traitements et qui sont très varié. Sur de nombreuses commandes, je suis dépendant d’autres services et notamment pour certaines avec des API fournies par d’autres entreprises.
Pourquoi je vous dis ça, car parfois, tout ne se passe pas si bien. Les résultats renvoyés par ces API externes peuvent donner des résultats disons étonnants. Pour faire rapide et simple, je ne compte plus le nombre d’erreurs non documentées qui remontent alors chez moi. Bien sûr, je ne vais pas jeter la pierre à ces entreprises de taille moyenne, on ne parle pas de multinationales. De plus, elles sont souvent elles même en période de développement actif, avec une petite équipe comme chez moi.
Alors pourquoi je vous raconte cette petite histoire ? J’ai besoin de suivre ce qu’il se passe. Surtout que certaines de mes commandes dans Laravel traitent de gros volumes de données. Au final, je me retrouve à faire des millions d’appels vers des services externes, donc des erreurs arrivent et j’ai besoin de savoir précisément où ça coince avant que tout soit stable des deux cotés.
Le fichier de log par défaut de Laravel
Lorsque vous installez le framework Laravel et que vous commencez à l’utiliser, à moins que vous soyez très fort, des erreurs vont se produire. C’est normal, je ne compte plus le nombre d’erreurs que je vois par jour et j’essaye d’ailleurs de les documenter ici. L’erreur s’affiche alors sur votre navigateur ou dans votre terminal et Laravel va alors automatiquement remplir le fichier de log de base. Ce fichier se trouve dans le dossier storage et ensuite dans le sous-dossier logs. Il est par défaut sobrement appelé laravel.log.
Le chemin exact du fichier de log par défaut dans Laravel est : /storage/logs/laravel.log
Tout cela, c’est très bien, mais chaque fois qu’une erreur va se produire, peu importe son origine, elle va remplir ce fichier laravel.log. Ce n’est pas un problème et c’est très bien d’avoir une trace, mais comme je vous le disais dans mon introduction, j’aime suivre précisément les choses. Ce fichier laravel.log de base qui est très utile pour développer son application va malheureusement être un peu trop pollué à mon goût. C’est pour cela que j’ai commencé à créer mes propres fichiers journaux d’événements.
Pourquoi faire mon propre fichier de log
Comme je vous le disais, ce fichier de log par défaut est très bien, mais si vous êtes encore en train d’améliorer votre application ou qu’elle est très complexe, ce fichier va très vite se remplir. C’est pour cela que je vais le garder, on en a besoin, mais seulement pour suivre les erreurs critiques de mon application Laravel. De ce côté, on ne touche à rien et garde le comportement par défaut du framework avec laravel.log.
En faisant notre propre fichier de log, nous allons pouvoir séparer les informations que l’on veut suivre. De plus, je vais pouvoir ajouter dans mon propre fichier de log seulement les choses que je souhaite vraiment. Sur les parties critiques de mon application Laravel, il s’agit de plusieurs commandes, j’ai vraiment besoin de suivre tout ce qu’il se passe et ne pas être pollué par autre chose.
L’avantage de faire cela, c’est que je peux facilement récupérer le contenu de ce fichier log personnalisé et je sais qu’il contient seulement ce que je veux, je maîtrise les données qui sont ajoutées dedans. Il peut y avoir d’autres pour lesquelles vous voulez faire votre fichier de log. Si je fais cet article, c’est pour vous donner mon cas de figure et les clés pour que de votre côté, vous puissiez en faire autant avec votre propre besoin.
Logging dans Laravel : le niveau de gravité des messages
Le système de logging de Laravel dispose de plusieurs niveaux d’alerte pour qualifier la nature des messages. Je vous en parle avant de vous montrer comment créer techniquement ce nouveau fichier de log personnalisé, car ce concept est important pour la suite. Si vous voulez par la suite exploiter ce fichier de log facilement, autant renseigner correctement ses messages dedans.
Voici les différents niveaux de gravité des logs, du plus important au moins important :
- emergency : les erreurs les plus graves, qui nécessitent une intervention immédiate, comme un système en panne ou un service indisponible.
- alert : une très grosse erreur qui doit être corrigée immédiatement, comme une base de données indisponible.
- critical : représente une erreur critique, comme une défaillance sur une partie de votre application ou une API indisponible par exemple.
- error : une erreur générique mais qui peut avoir des conséquences importantes, comme une erreur de syntaxe dans une requête SQL.
- warning : ce n’est pas une erreur mais ce que vous mettez derrière ce message mérite une attention particulière, comme une ressource proche de la limite.
- notice : une information intéressante pour le suivi du système, comme un utilisateur qui se connecte ou une opération réussie.
- info : des informations générales sur le système, comme les messages d’initialisation ou les résultats d’opérations.
- debug : les informations de débogage, utiles lorsque vous êtes en train de développer votre application pour suivre ce qu’il se passe.
Bien évidemment, vous pouvez les utiliser comme vous voulez, c’est juste à titre d’information pour la lecture. Vous pouvez sans souci log une erreur pas grave du tout dans emergency si vous en avez envie.
Comment ajouter son journal de logs personnalisé dans Laravel
On va maintenant passer aux choses sérieuses, comment créer un nouveau fichier de journalisation log dans Laravel. Vous allez voir, c’est finalement très simple à condition d’avoir les bonnes informations. Pour ajouter faire fonctionner notre nouveau fichier de log, il faut donc modifier le fichier : /config/logging.php.
Une fois dans ce fichier, il vous suffit d’ajouter le code suivant dans le tableau général channels :
'channels' => [ // ... // contenu par défaut de Laravel 'mon_fichier' => [ 'driver' => 'single', 'path' => storage_path('logs/mon_fichier.log'), 'level' => 'info', ], ],
Le paramètre level dans la configuration du canal de journalisation définit le niveau minimal de gravité des messages qui seront enregistrés dans le fichier de journal pour ce canal. Cela signifie que tous les messages de gravité égale ou supérieure à ce niveau seront enregistrés.
Si vous changez le niveau de gravité à warning, par exemple, seuls les messages de gravité warning et supérieure seront enregistrés, tandis que les messages de gravité info ne seront pas enregistrés. Il faut donc bien gérer ce paramètre et le manipuler avec cohérence pour faire du logging sein de votre application.
Pour terminer, il faut bien le remplir notre fichier de log. Pour cela, rien de plus facile, il faut d’abord appeler la classe Log de Laravel là où vous allez les utiliser avec un simple use :
use Illuminate\Support\Facades\Log;
Puis vous pouvez enfin ajouter les messages de log au sein de votre code avec les fonctions suivantes :
Log::channel('mon_fichier')->emergency('Ceci est une situation d\'urgence.'); Log::channel('mon_fichier')->alert('Ceci est une alerte.'); Log::channel('mon_fichier')->critical('Ceci est une erreur critique.'); Log::channel('mon_fichier')->error('Ceci est une erreur.'); Log::channel('mon_fichier')->warning('Ceci est un avertissement.'); Log::channel('mon_fichier')->notice('Ceci est une notification.'); Log::channel('mon_fichier')->info('Ceci est un message d\'information.'); Log::channel('mon_fichier')->debug('Ceci est un message de débogage.');