[PYTHON] Il est pratique d'utiliser stac_info et exc_info lorsque vous souhaitez afficher la traceback dans la sortie du journal par journalisation.

introduction

Lorsque vous souhaitez afficher les informations d'emplacement avec les informations d'emplacement lorsque vous sortez le journal à l'aide du journal de journalisation Il y a. Pour le dire concrètement, je veux un retraçage. Discutez de la marche à suivre lors de l'inclusion de ce suivi dans le journal.

Manière stupide

Bien sûr, il existe une histoire que vous pouvez ajouter vous-même au journal. Comme ci-dessous.

import logging
import traceback
logger = logging.getLogger("sample")


def foo():
    bar()


def bar():
    logger.info("bar")
    logger.info("tb: %s", "".join(traceback.format_stack()))


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)
    foo()

Traceback est affiché pour le moment.

INFO:sample:bar
INFO:sample:tb:   File "qr_64852sBQ.py", line 18, in <module>
    foo()
  File "qr_64852sBQ.py", line 8, in foo
    bar()
  File "qr_64852sBQ.py", line 13, in bar
    logger.info("tb: %s", "".join(traceback.format_stack()))

Cependant, il est difficile de prendre la peine de récupérer le retraçage par vous-même. Il est étrange d'exiger des connaissances en python (ʻimport traceback`) juste pour la sortie du journal en premier lieu.

stack_info

En fait, vous n'avez pas à ajouter vous-même le suivi comme ci-dessus, ajoutez simplement stack_info = True lorsque vous vous déconnectez avec logger.

--- 00sample.py	2017-07-13 08:06:10.000000000 +0900
+++ 01sample.py	2017-07-13 08:09:06.000000000 +0900
@@ -1,6 +1,5 @@
 # -*- coding:utf-8 -*-
 import logging
-import traceback
 logger = logging.getLogger("sample")
 
 
@@ -9,8 +8,7 @@
 
 
 def bar():
-    logger.info("bar")
-    logger.info("tb: %s", "".join(traceback.format_stack()))
+    logger.info("bar", stack_info=True)

Lorsque je l'exécute, le suivi est affiché après Pile (dernier appel le plus récent).

INFO:sample:bar
Stack (most recent call last):
  File "qr_64852GWc.py", line 16, in <module>
    foo()
  File "qr_64852GWc.py", line 7, in foo
    bar()
  File "qr_64852GWc.py", line 11, in bar
    logger.info("bar", stack_info=True)

exc_info

Vous souhaiterez peut-être afficher le traçage de la position d'occurrence d'exception au lieu de la position de sortie du journal. Par exemple, le même format que lors de l'utilisation de logger.exceptipn (). Vous pouvez le faire en passant ʻexc_info au lieu de stack_info`.

import logging
logger = logging.getLogger("sample")


def foo():
    bar()


def bar():
    logger.info("bar")
    1 / 0


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)
    try:
        foo()
    except:
        logger.info("hmm", exc_info=True)

Le traçage de la position où l'erreur de division zéro se produit est extrait de l'objet d'exception et automatiquement écrit ensemble.

INFO:sample:bar
INFO:sample:hmm
Traceback (most recent call last):
  File "qr_64852t0u.py", line 18, in <module>
    foo()
  File "qr_64852t0u.py", line 7, in foo
    bar()
  File "qr_64852t0u.py", line 12, in bar
    1 / 0
ZeroDivisionError: division by zero

Recommended Posts

Il est pratique d'utiliser stac_info et exc_info lorsque vous souhaitez afficher la traceback dans la sortie du journal par journalisation.
Lorsque vous souhaitez l'utiliser tel quel lorsque vous l'utilisez avec lambda memo
[Python] Lorsque vous souhaitez importer et utiliser votre propre package dans le répertoire supérieur
[Python] Lorsque vous souhaitez utiliser toutes les variables dans un autre fichier
Lorsque vous exécutez diff en python et que vous voulez à la fois le code de retour et la sortie
Si vous souhaitez compter les mots en Python, il est pratique d'utiliser Counter.
Comment utiliser is et == en Python
Utilisation pratique des couches lors du chargement de bibliothèques sur Lambda
Il est plus pratique d'utiliser csv-table lors de l'écriture d'une table avec python-sphinx
[OpenCV] Lorsque vous voulez vérifier s'il est lu correctement avec imread
Il est facile d'exécuter SQL avec Python et de générer le résultat dans Excel
Comment utiliser Decorator dans Django et comment le créer
Qu'est-ce que pip et comment l'utilisez vous?
Lorsque vous voulez plt.save dans l'instruction for
Si vous voulez mettre un argument dans la fonction de fermeture et l'exécuter plus tard
Utilisez aggdraw lorsque vous voulez dessiner magnifiquement avec un oreiller
Lorsque vous souhaitez utiliser python 2.x sur Gentoo Linux moderne
Je veux que Sphinx soit pratique et utilisé par tout le monde
Écrivez un script dans Shell et Python pour vous avertir dans Slack lorsque le processus est terminé
Introduction à l'utilisation de Pytorch Lightning ~ Jusqu'à ce que vous formatez votre propre modèle et le produisez sur tensorboard ~
NameError: le nom global'dot_parser 'n'est pas défini et que faire quand il apparaît en python
[Sous-processus] Lorsque vous souhaitez exécuter un autre programme Python en code Python
Acquérir automatiquement le journal des opérations dans le terminal lors de la connexion à Linux
Quand il est difficile de copier ce que vous avez construit avec vue
Je veux créer un fichier pip et le refléter dans le menu fixe
Lorsque vous souhaitez trier une liste multidimensionnelle sur plusieurs lignes
Comment saisir une chaîne de caractères en Python et la sortir telle quelle ou dans la direction opposée.
Que faire si vous obtenez l'erreur RuntimeError: Python n'est pas installé en tant que framework lorsque vous essayez d'utiliser matplitlib et pylab dans Python 3.3