web-dev-qa-db-fra.com

En python, pourquoi utiliser la journalisation au lieu de print?

Pour un débogage simple dans un projet complexe, y a-t-il une raison d'utiliser le consignateur Python au lieu de l'impression? Qu'en est-il des autres cas d'utilisation? Existe-t-il un meilleur cas d'utilisation accepté pour chacun (en particulier lorsque vous ne recherchez que stdout)?

J'ai toujours entendu dire qu'il s'agit d'une "meilleure pratique" mais je n'ai pas été en mesure de comprendre pourquoi.

52
Sam Odio

Le paquet de journalisation a beaucoup de fonctionnalités utiles:

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

L'impression n'en a pas.

De plus, si votre projet doit être importé par d'autres outils Python, il est déconseillé à votre paquet 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 de propager ou non les messages de journalisation à partir de votre outil.

63
user297250

L'un des principaux avantages d'une journalisation correcte 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 d'atténuer le contrôle pour les autres parties, afin de ne pas être pris en charge par la surcharge d'informations et de vous concentrer facilement sur la tâche dont vous avez besoin. enregistrement.

En outre, les journaux sont configurables. Vous pouvez facilement les filtrer, les envoyer dans des fichiers, les formater, ajouter des horodatages et toute autre chose dont vous pourriez avoir besoin de manière globale. Les déclarations imprimées ne sont pas faciles à gérer.

18
rid

Les instructions d'impression sont en quelque sorte le 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 le 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 tout est prêt.

Instrumenter l'application peut nécessiter un certain travail initial, modifiant le code source d'une manière ou d'une autre, mais la sortie de diagnostic résultante peut comporter 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 consigné, mais également le fichier et la fonction qui l’appelle, une trace le cas échéant, l’heure à laquelle le message a été émis, etc. Plus que ça; les instruments de diagnostic doivent jamais être supprimés; C'est tout aussi valable et utile lorsque le programme est terminé et en production que c'était le jour de son ajout. mais sa sortie peut rester bloquée dans un fichier journal qui ne gênera vraisemblablement personne, ou le niveau de journalisation peut être abaissé pour conserver 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 les tests et se familiariser avec les commandes qu’il utilise pour contrôler le débogueur pdb intégré. 

Lorsque vous vous imaginez qu'une instruction print peut être plus facile que d'utiliser pdb (comme c'est souvent le cas), vous constaterez que l'utilisation d'un enregistreur place votre programme dans un état beaucoup plus facile à travailler que si vous utilisez et supprimez ultérieurement des instructions print .

Mon éditeur est configuré pour mettre en surbrillance les instructions d'impression comme erreurs de syntaxe, et pour consigner les instructions comme des commentaires, car c'est ce que je considère comme telles.

Si vous utilisez la journalisation, le responsable du déploiement peut configurer le consignateur pour l'envoyer à un emplacement personnalisé, avec des informations personnalisées. Si vous n'imprimez que, c'est tout ce qu'ils ont.

4

La journalisation crée essentiellement une base de données en texte brut interrogeable contenant des résultats d'impression avec d'autres métadonnées (horodatage, niveau de log, numéro de ligne, processus, etc.).

C'est de l'or pur, je peux exécuter egrep sur le fichier journal après le script python a été exécuté . Je peux ajuster 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'eurep par la suite, par essais et erreurs, constituent 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 permet pas (envoi vers socket, définition des niveaux de débogage, logrotate, ajout de métadonnées, etc.), vous avez toutes les raisons de préférer la journalisation aux instructions en clair.

J'ai tendance à utiliser des instructions d'impression parce que c'est paresseux et facile, ajoutant que la journalisation a besoin d'un code de plaque de chaudière, hé nous avons yasnippets (emacs) et ultisnips (vim) et d'autres outils de modélisation, alors pourquoi abandonner la journalisation pour les instructions en clair!

0
ticktock