En python, pourquoi utiliser la journalisation au lieu de l'impression?

92

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.

Sam Odio
la source
3
Pour les grands projets, la journalisation est toujours une «meilleure pratique» car vous pouvez facilement l'activer ou la désactiver, et obtenir plus ou moins d'informations. l'impression n'offre aucun de ces avantages.
Chris Eberle
3
Je ne pense pas qu'il y ait jamais de meilleur cas d'utilisation print.
SingleNegationElimination
4
La documentation de journalisation python indique que le meilleur cas d'utilisation printconsiste à afficher des messages d'aide pour l'utilisateur dans une application de ligne de commande.
slushy
En lisant toutes ces réponses, je veux poser la question inverse: y a-t-il jamais une raison de ne pas utiliser la journalisation?
information_interchange

Réponses:

101

Le package de journalisation a de nombreuses fonctionnalités utiles:

  • Facile à voir où et quand (même de quel numéro de ligne) un appel de journalisation est effectué.
  • Vous pouvez vous connecter à des fichiers, des sockets, à peu près n'importe quoi, le tout en même temps.
  • Vous pouvez différencier votre journalisation en fonction de la gravité.

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.

Ondrej Slinták
la source
2
Très bien dit. J'utiliserai parfois print lors du débogage d'un script jetable que j'ai l'intention d'exécuter exactement une fois, mais tout code qui sera jamais vu par d'autres yeux humains ou qui est censé durer plus d'un jour obtient un journal.
TimothyAWiseman
22

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.

débarrasser
la source
3
Certainement +1 pour envoyer la sortie aux fichiers. L'analyse d'un fichier journal dans le post-mortem est bien meilleure que d'avoir à le faire à nouveau casser dans une fenêtre de console ouverte pour trouver l'erreur. Fondamentalement, un enregistreur est idéal pour chaque fois que vous avez besoin de déboguer le script après qu'il a échoué plutôt que pendant qu'il échoue. Il est également idéal pour chaque fois que vous devez déboguer un problème complexe qui vous oblige à analyser la sortie du programme. En gros, chaque fois que vous avez affaire à des erreurs plus complexes que des erreurs de syntaxe, un enregistreur simplifiera probablement cela pour vous.
Jonathanb
11

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.

SingleNegationElimination
la source
4

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.

Ignacio Vazquez-Abrams
la source
1

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 !?

TIC Tac
la source