Pour un débogage simple dans un projet complexe, y a-t-il une raison d'utiliser le logger python au lieu d'imprimer? Qu'en est-il des autres cas d'utilisation? Existe-t-il un meilleur cas d'utilisation accepté pour chacun (en particulier lorsque vous recherchez uniquement stdout)?
J'ai toujours entendu dire que c'était une «meilleure pratique», mais je n'ai pas été en mesure de comprendre pourquoi.
print
.print
consiste à afficher des messages d'aide pour l'utilisateur dans une application de ligne de commande.Réponses:
Le package de journalisation a de nombreuses fonctionnalités utiles:
Print n'en a aucun.
De plus, si votre projet est destiné à être importé par d'autres outils python, il est déconseillé d'imprimer des éléments sur stdout, car l'utilisateur ne saura probablement pas d'où proviennent les messages d'impression. Avec la journalisation, les utilisateurs de votre package peuvent choisir s'ils souhaitent ou non propager ou non les messages de journalisation de votre outil.
la source
L'un des principaux avantages d'une journalisation appropriée est que vous pouvez classer les messages et les activer ou les désactiver en fonction de vos besoins. Par exemple, il peut être utile d'activer les messages de niveau de débogage pour une certaine partie du projet, mais de les atténuer pour d'autres parties, afin de ne pas être envahi par une surcharge d'informations et de vous concentrer facilement sur la tâche dont vous avez besoin enregistrement.
De plus, les journaux sont configurables. Vous pouvez facilement les filtrer, les envoyer dans des fichiers, les formater, ajouter des horodatages et tout autre élément dont vous pourriez avoir besoin à l'échelle mondiale. Les déclarations imprimées ne sont pas facilement gérées.
la source
Les instructions d'impression sont en quelque sorte le pire des deux mondes , combinant les aspects négatifs d'un débogueur en ligne avec une instrumentation de diagnostic. Vous devez modifier le programme mais vous n'obtenez pas plus de code utile .
Un débogueur en ligne vous permet d'inspecter l'état d'un programme en cours d'exécution; Mais ce qui est bien avec un vrai débogueur, c'est que vous n'avez pas à modifier la source; ni avant ni après la session de débogage; Il vous suffit de charger le programme dans le débogueur, d'indiquer au débogueur où vous voulez regarder et vous êtes prêt.
L'instrumentation de l'application peut nécessiter un certain travail au départ, en modifiant le code source d'une certaine manière, mais la sortie de diagnostic qui en résulte peut avoir d'énormes quantités de détails et peut être activée ou désactivée à un degré très spécifique. Le module de journalisation python peut afficher non seulement le message enregistré, mais également le fichier et la fonction qui l'ont appelé, un suivi s'il y en avait un, l'heure réelle à laquelle le message a été émis, etc. Plus que ça; les instruments de diagnostic ne doivent jamais être retirés; C'est tout aussi valable et utile lorsque le programme est terminé et en production que le jour où il a été ajouté; mais il peut avoir sa sortie bloquée dans un fichier journal où il n'est pas susceptible d'ennuyer qui que ce soit, ou le niveau de journal peut être baissé pour garder tous les messages sauf les plus urgents.
anticiper le besoin ou l'utilisation d'un débogueur n'est vraiment pas plus difficile que d'utiliser ipython pendant que vous testez et de vous familiariser avec les commandes qu'il utilise pour contrôler le débogueur intégré pdb.
Lorsque vous pensez qu'une instruction print pourrait être plus facile que d'utiliser pdb (comme c'est souvent le cas), vous constaterez que l'utilisation d'un enregistreur entraîne votre programme dans un état beaucoup plus facile à travailler que si vous utilisez et supprimez ultérieurement les instructions print .
Mon éditeur est configuré pour mettre en évidence les instructions d'impression comme des erreurs de syntaxe et les instructions de journalisation comme des commentaires, car c'est ainsi que je les considère.
la source
Si vous utilisez la journalisation, la personne responsable du déploiement peut configurer l'enregistreur pour l'envoyer à un emplacement personnalisé, avec des informations personnalisées. Si vous n'imprimez que, c'est tout ce qu'ils obtiennent.
la source
La journalisation crée essentiellement une base de données en texte brut consultable des sorties d'impression avec d'autres métadonnées (horodatage, niveau de journal, numéro de ligne, processus, etc.)
C'est de l'or pur, je peux exécuter egrep sur le fichier journal après l'exécution du script python. Je peux régler ma recherche de modèle egrep pour choisir exactement ce qui m'intéresse et ignorer le reste. Cette réduction de la charge cognitive et la liberté de choisir mon modèle d'egrep plus tard par essais et erreurs est le principal avantage pour moi.
tail -f mylogfile.log | egrep "key_word1|key_word2"
Maintenant, ajoutez d'autres choses intéressantes que l'impression ne peut pas faire (envoyer au socket, définir les niveaux de débogage, logrotate, ajouter des métadonnées, etc.), vous avez toutes les raisons de préférer la journalisation aux instructions d'impression simples.
J'ai tendance à utiliser des instructions d'impression parce que c'est paresseux et facile, l'ajout de la journalisation nécessite du code de chaudière, hé nous avons yasnippets (emacs) et ultisnips (vim) et d'autres outils de création de modèles, alors pourquoi abandonner la journalisation pour les instructions d'impression simples !?
la source