En un mot: arrêtons-nous
Veuillez lire ce qui suit comme une histoire.
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.
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.
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.
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.