Logs & Bonnes Pratiques
Comment utiliser les différents niveaux de logs ?
Préambule
Il s'agit ici d'une modalité d'utilisation des logs que nous employons chez ITAMETIS. La pratique fonctionne bien pour nos produits et notre façon de gérer nos productions. Cela peut être différent en fonction de votre contexte et de vos contraintes.
Les différents niveaux de logs
Tous nos logs sont produits à partir de l'interface/façade SLF4J. Celle-ci expose des méthodes permettant l'écriture de logs sur cinq niveaux décroissants de criticité :
- ERROR
- WARNING
- INFO
- DEBUG
- TRACE
À quoi correspond chaque niveau ?
Commençons du niveau le moins critique jusqu'au plus critique.
TRACE
Ce niveau est à destination des Développeurs et uniquement eux. Il a pour vocation de se substituer à un mode debug impossible sur un serveur en production et d'en retranscrire chaque changement de valeur.
À titre d'exemple ce niveau contient :
- Les valeurs des paramètres.
- Les valeurs des attributs après initialisation.
- Le fait d'être passer dans une branche ou une autre d'une condition.
- Les valeurs des conditions de sortie des boucles.
- Etc.
DEBUG
Ce niveau est à destination des Admin-sys et éventuellement des Développeurs lorsqu'ils aident au dépannage. Le but est de fournir à celui qui assure l'état de la production les moyens de comprendre ce qui est en train de se passer au niveau des composants. Si le niveau TRACE correspond à un debugger activé en mode pas-à-pas, le niveau DEBUG se contentrait d'afficher uniquement les valeurs aux points d'arrêts.
À titre d'exemple ce niveau contient :
- Les ports dynamiques ouverts.
- Chaque tentative d'accès aux périphériques (points de montages, bases de données, etc).
- Les temps de traitement/latence des différents composants.
- Les informations sur le chargement des modules de l'application.
- Etc.
INFO
Ce niveau est à destination du Métier et des équipes de Sécurité. Le but est de fournir une vision permettant de comprendre quel utilisateur, a fait quoi, à quelle heure, sur quelles données, avec quelles saisies, a obtenu quel résultat, etc.
À titre d'exemple ce niveau contient :
- Les requêtes effectuées.
- Les valeurs des inputs.
- Les ID des utilisateurs.
- Les permissions des utilisateurs.
- Les logins des comptes de service mais jamais leurs mots de passe !
- Etc.
WARN
Ce niveau est à destination de Tous. Il a pour objectif d'enregistrer l'occurrence d'une erreur tout en sachant que l'application a su "retomber sur ses pattes". La stabilité de l'application, la cohérence et l'intégrité de ses données ne sont pas atteintes, cependant un utilisateur n'a pu obtenir de résultat à sa demande.
En général, un nombre important de warning conduira à un erreur.
À titre d'exemple ce niveau contient :
- Des disques temporairement inaccessible mais que le rejeu du traitement a pu obtenir.
- Des pool de connexion arrivant à saturation.
- Des lenteurs lors de connexions à la base de données.
- Des valeurs interdites mais détectées et rejetées.
- Des tentatives d'attaques.
- Etc.
ERROR
Ce niveau est à destination de Tous. Il a pour objectif de tracer qu'une erreur grave s'est produite et que l'application est potentiellement en état instable. Cet historique doit permettre de reconstituer ce qui s'est mal passé mais également de corriger manuellement l'état de l'application si les données étaient devenues incohérentes ou incomplètes.
À titre d'exemple ce niveau contient :
- Les raisons ayant fait qu'un algorithme qui n'a pu se terminer.
- Toutes les exceptions.
- Tout problème de connexion.
- Toute erreur d'un autre système.
- Toute donnée lue mais incohérente, inconsistante ou incomplète.
- Etc.
Conclusion
Il faut bien comprendre qu'il n'y a pas de vérité générale sur comment produire et gérer ses logs mais qu'il est possible d'affecter à chaque niveau un type d'utilisation précis. En faisant cela, le débuggage et le support s'en retrouveront grandement simplifiés.