Maison >développement back-end >Tutoriel Python >Journalisation Python à l'aide d'un seul fichier (nom de fonction, nom de fichier, numéro de ligne)

Journalisation Python à l'aide d'un seul fichier (nom de fonction, nom de fichier, numéro de ligne)

PHPz
PHPzavant
2024-02-08 22:00:211125parcourir

使用单个文件的 Python 日志记录(函数名、文件名、行号)

Contenu de la question

J'essaie de comprendre comment fonctionne l'application. Pour ce faire, j'insère des commandes de débogage comme première ligne dans le corps de chaque fonction, dans le but d'enregistrer le nom de la fonction et le numéro de ligne (dans le code) qui envoie le message à la sortie du journal. Enfin, étant donné que cette application est composée de nombreux fichiers, j'aimerais créer un fichier journal afin de mieux comprendre le flux de contrôle de l'application.

Voici ce que je sais :

  1. Pour obtenir le nom de la fonction, je peux le faire en C en utilisant la macro function_name.__name__ 但我不想使用 function_name (这样我就可以快速复制并粘贴通用的 Log.info("Message") 到正文中所有功能)。我知道这可以使用 __func__, mais je ne suis pas sûr de python.

  2. Pour obtenir le nom de fichier et le numéro de ligne, j'ai vu (et je crois) que mon application utilise Python locals() 函数,但使用的语法我并不完全了解,例如: options = " LOG.debug('%(flag)s : %(flag_get)s' % locals()) 我尝试使用 LOG.info("My message %s" % locals()) 来生成类似 的内容{'self': 9f80b6a9b02e2f6bd3a3a454f4c1763b}. Une contribution à ce sujet ?

  3. Je sais comment utiliser la journalisation et y ajouter des gestionnaires pour me connecter à un fichier, mais je ne suis pas sûr de pouvoir utiliser un seul fichier pour enregistrer tous les messages du journal dans le bon ordre des appels de fonction dans mon projet.


Réponse correcte


Vous avez ici des questions non pertinentes.

Je vais commencer par le plus simple : (3). En utilisant logging, vous pouvez regrouper tous les appels vers un seul fichier journal ou une autre destination de sortie : ils seront classés dans l'ordre dans lequel ils se produisent au cours du processus.

Étape suivante : (2). La valeur de locals() 提供当前范围的字典。因此,在没有其他参数的方法中,作用域中有 self,其中包含对当前实例的引用。所使用的让您感到困惑的技巧是使用字典作为 % 运算符的 rhs 的字符串格式。 "%(foo)s" % bar 将被替换为 bar["foo"].

Enfin, vous pouvez utiliser certaines techniques d'introspection, similaires à celles utilisées par pdb pour enregistrer plus d'informations :

def autolog(message):
    "Automatically log the current function details."
    import inspect, logging
    # Get the previous frame in the stack, otherwise it would
    # be this function!!!
    func = inspect.currentframe().f_back.f_code
    # Dump the message + the name of this function to the log.
    logging.debug("%s: %s in %s:%i" % (
        message, 
        func.co_name, 
        func.co_filename, 
        func.co_firstlineno
    ))

Cela enregistrera le message entrant, ainsi que le nom de la fonction (originale), le nom du fichier dans lequel il a été défini et la ligne de ce fichier. Voir inspect - Inspecter les objets vivants pour plus de détails.

Comme je l'ai mentionné dans un commentaire précédent, vous pouvez également toujours insérer la ligne import pdb; pour accéder à l'invite de débogage interactive <code>import pdb; 行,进入 <code>pdb 交互式调试提示符。 pdb.set_trace(). pdb.set_trace() et réexécutez votre programme. Cela vous permet de parcourir le code et d'inspecter les données en fonction de votre sélection.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer