Ajouter le niveau de journal TRACE à Python ...?

En un mot: arrêtons-nous

Veuillez lire ce qui suit comme une histoire.

De quel genre de demande s'agit-il en premier lieu?

log4j (http://ja.wikipedia.org/wiki/Log4j) a un niveau appelé TRACE sous DEBUG. Je pense que c'est une fonction très fourmis.

Par exemple, au début et à la fin d'une fonction, "commencé!" Et "terminé!" Si vous écrivez au niveau du journal TRACE, ou `` LOG.trace () '', etc., et écrivez le processus intermédiaire dans DEBUG C'est comme être capable de définir plusieurs étapes comme -vv (dans le cas de ssh) pour -v à un niveau légèrement plus significatif. Lorsqu'un insecte survient, l'herbe est inévitable.

Pendant le développement, il peut être intéressant de savoir au niveau du journal "quelle fonction a fonctionné jusqu'à la fin". Il n'est pas toujours possible d'exécuter le débogueur dans toute l'histoire, et j'utilise "printf debug". Aidez-moi.

Définir quelque chose comme TRACE semble être "rien que vous ne pouvez pas faire"

Les niveaux de journal Python sont numériques en premier lieu, et DEBUG, INFO, etc. sont en fait mappés à des valeurs numériques.

https://docs.python.org/3.4/library/logging.html#logging-levels

Par exemple, lorsque vous crachez un journal, écrivez comme suit

logging.debug ('ne devrait pas être écrit de cette façon') logging.log (logging.DEBUG, 'So!')

(En fait, vous pouvez utiliser Logger)

Puisque logging.DEBUG vaut simplement 10, la notation ci-dessus représente effectivement la sortie au même niveau de journal que la notation suivante.

logging.log (10, «Nmo!»)

NOTSET (0) est un peu spécial, alors mettons-le de côté, et même si vous utilisez des nombres de 1 à 9, la fonction de journalisation ne se plaindra pas. Au contraire, DEBUG et INFO sont simplement traités comme des alias de nombres.

Comme nous le verrons plus loin, certains mécanismes n'acceptent actuellement que des nombres (par exemple logging.log (lvl, msg) '' `` lvl est un nombre et n'accepte pas 'DEBUG' etc. )

Ainsi, si vous spécifiez un nombre tel que 5 et écrivez logging.log (5, 'wafu') '', etc., vous pouvez écrire setLevel (logging.DEBUG) ''. Ne sera pas affiché.

Si vous faites quelque chose comme TRACE en spécifiant des valeurs numériques, cela ressemblera à ce qui suit.

from logging import getLogger, StreamHandler, DEBUG
logger = getLogger(__name__)
handler = StreamHandler()
logger.setLevel(DEBUG)
handler.setLevel(DEBUG)
logger.addHandler(handler)

logger.log (5, 'Je vais commencer') .. logger.debug ('C'est gros') .. logger.log (5, 'C'est fini')

Dans l'exemple ci-dessus, "Début" et "Fin" ne sont pas affichés. C'est juste "C'est gros". Un moyen d'obtenir des journaux de débogage qui ne sont vraiment utiles que pour les développeurs Personnellement, je ne pense pas que ce soit terrible. Ou plutôt pratique.

Je veux aussi logging.trace () et logger.trace ()!

Ici, la journalisation a une fonction appelée ```addLevelName () `` `. (https://docs.python.org/3.4/library/logging.html#logging.addLevelName)

Oh, c'est `` logger.trace () ''

Pas fait :-)

logging.trace()Et enregistreur.trace()N'est pas fait, encore moins la journalisation.log('TRACE', 'Bonjour')Je ne peux pas le faire. Se connecter en premier lieu.log('INFO', 'Allons coller')Pas même autorisé.



 # Vous pouvez spécifier quelque chose comme `` logger.setLevel ('INFO') '' (pour être exact, il semble que ce ne soit que la dernière version après 3.2. Pour une raison quelconque, il inclut également 2.7). Il est également possible de spécifier `` `` --log = DEBUG``` avec argparse et de l'insérer directement dans `` `` setLevel () ''.

 Probablement, c'est juste une fonction que `` `` Formatter``` affiche "TRACE" au lieu de "Level 5", n'est-ce pas?

 (comme ipython)
    > import logging
    > logger = logging.getLogger('test')
    > logger.setLevel(1)
    > handler = logging.StreamHandler()
    > handler.setLevel(1)
    > formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
    > handler.setFormatter(formatter)
    > logger.addHandler(handler)
    >  logger.debug('hello')
    2014-05-01 11:02:12,743 - DEBUG - hello
    > logger.log(5, 'hoge')
    2014-05-01 11:02:20,599 - Level 5 - hoge
    > logging.addLevelName(5, 'TRACE')
    > logger.log(5, 'hoge')
    2014-05-01 11:02:43,173 - TRACE - hoge

 Pour être précis, si vous dérangez le contenu de la journalisation Murikuri, vous pourrez peut-être ajouter `` logging.trace () '' etc. C'est Python.

 Cependant, il n'existe pas par défaut comme une implémentation agréable et sûre, et je ne pense pas que cela va dans cette direction à l'avenir.

 Même si je pouvais le faire, je peux voir que c'est juste super gênant.
 On ne peut pas dire que l'enregistreur reçu par chaque fonction ou similaire l'a toujours. Surtout s'il est fourni sous forme de bibliothèque, il est visible que les enregistreurs qui ne connaissent pas la trace viennent de l'extérieur.
 Parfois j'ai une trace ou pas, donc je me demande si je l'utilise en vérifiant avec getattr.
 La commodité n'est pas très bien.

# En premier lieu, le fonctionnaire dit quelque chose comme "ne le faites pas".

https://docs.python.org/2/howto/logging.html#custom-levels

> Defining your own levels is possible, but should not be necessary, as the existing levels have been chosen on the basis of practical experience. However, if you are convinced that you need custom levels, great care should be exercised when doing this, and it is possibly a very bad idea to define custom levels if you are developing a library. That’s because if multiple library authors all define their own custom levels, there is a chance that the logging output from such multiple libraries used together will be difficult for the using developer to control and/or interpret, because a given numeric value might mean different things for different libraries.

https://docs.python.org/3.2/howto/logging.html#custom-levels

> Defining your own levels is possible, but should not be necessary, as the existing levels have been chosen on the basis of practical experience. However, if you are convinced that you need custom levels, great care should be exercised when doing this, and it is possibly a very bad idea to define custom levels if you are developing a library. That’s because if multiple library authors all define their own custom levels, there is a chance that the logging output from such multiple libraries used together will be difficult for the using developer to control and/or interpret, because a given numeric value might mean different things for different libraries.

https://docs.python.org/3.4/howto/logging.html#custom-levels

> Defining your own levels is possible, but should not be necessary, as the existing levels have been chosen on the basis of practical experience. However, if you are convinced that you need custom levels, great care should be exercised when doing this, and it is possibly a very bad idea to define custom levels if you are developing a library. That’s because if multiple library authors all define their own custom levels, there is a chance that the logging output from such multiple libraries used together will be difficult for the using developer to control and/or interpret, because a given numeric value might mean different things for different libraries.

# Conclusion

 Arrêtons-nous

 Si vous l'utilisez, préparez un gestionnaire spécifique qui crache un journal très détaillé en tant que journal de "débogage" pour un bogue que le développeur ne peut pas comprendre, réglez uniquement ce gestionnaire au niveau de journal 1, et les autres seront confus avec DEBUG. Suffit-il de faire face à de telles étapes multiples?

 À la toute fin de mon insistance sur «arrêtons-nous», j'étais convaincu que «Oh, alors je ne peux pas pardonner», et c'est tout.


Recommended Posts

Ajouter le niveau de journal TRACE à Python ...?
Essayez de calculer Trace en Python
Comment modifier le niveau de journalisation d'Azure SDK pour Python
Sortie du journal Python vers la console avec GAE
Connectez-vous à Slack à l'aide de requêtes en Python
[Python] Ajouter le nombre total de lignes à Pandas DataFrame
Ajouter du bruit gaussien aux images avec python2.7
Comment ajouter un module python à l'environnement anaconda
Ajouter un environnement virtuel Python à VSCode
[Python] Ajouter un commentaire au fichier d'entrée standard
Mis à jour vers Python 2.7.9
"Backport" vers python 2
Ajouter une ligne diagonale (hachures) à la carte thermique (python, matplotlib)
Comment ajouter un chemin de recherche de module Python
Vitesse: ajouter un élément à la fin du tableau Python
[CentOS8] Comment afficher la sortie Python standard dans le journal systemd
[Python] [Django] Comment utiliser le champ de choix et comment ajouter des options
Comment ajouter de l'aide à HDA (avec bonus de script Python)
Changements de Python 3.0 à Python 3.5
Comment installer python
Introduction au langage Python
Remarque pour faire de python un démon
Comment ajouter des numéros de page à un fichier PDF (en Python)
Introduction de Python 2.7 à CentOS 6.6
Connectez python à mysql
Bibliothèque standard de journalisation Python pour la sortie de fichier par niveau de journal
[GCP] Comment générer des journaux Cloud Functions vers Cloud Logging (Stackdriver Logging) (Python)
Comment se connecter à AtCoder avec Python et soumettre automatiquement
Connectez-vous à BigQuery avec Python
[2020.8 dernière] Comment installer Python
[python] Convertir la date en chaîne
Publier de Python vers Slack
Comment installer Python [Windows]
publier sur vim → Python → Slack
Introduction à Python Django (2) Win
Pour vider stdout en Python
Convertir numpy int64 en python int
python3: Comment utiliser la bouteille (2)
Ajouter / supprimer un noyau à JupyterLab
[Python] Convertir la liste en Pandas [Pandas]
Flirter de PHP à Python
Une route vers Python intermédiaire
Essayez de comprendre Python soi
Notes Python à oublier bientôt
[Python] Comment utiliser la liste 1
Ajouter un dictionnaire à MeCab
Connectez-vous au site Web en Python
Connectez-vous à Wikipedia avec Python
Comment mettre à jour Tkinter de Python vers la version 8.6
Publiez sur Slack avec Python 3
Ajouter un numéro de page au PDF
Anaconda mis à jour de 4.2.0 à 4.3.0 (python3.5 mis à jour vers python3.6)
Publier sur Twitter en utilisant Python
Comment utiliser Python Argparse
Commencez à Selenium en utilisant python
Introduction à la communication série [Python]