8
votes

Comment puis-je enregistrer le nom du paquet en python?

J'utilise Pythons Loging Module. Je veux enregistrer le chemin complet d'un message, comme
"msg packagename.modulename.funkcunknameNameName linenumber", mais comment puis-je obtenir le nom du package d'un message?

La configuration de la journalisation est la suivante: xxx

}

Et je reçois un enregistreur comme celui-ci: xxx


1 commentaires

Qu'entendez-vous par «nom de paquet» qui est différent de ce que % (module) s produit?


6 Réponses :


2
votes

Je vois deux solutions au problème.

Un, transmettez-le dans le nom de fichier avec chaque appel au journal. [Débogage, info, erreur, ...] comme obtenu par le fichier __ (code> variable magique. Cela ne vous donne pas le nom du paquet, mais c'est aussi bon que celui pour déterminer où le message de journal est originaire. L'inconvénient est que vous devez modifier chaque appel de journalisation dans votre application.

Deux, faire une sous-classe de Logging.logger qui remplace la méthode de l'instance logger.log . Dans votre nouvelle méthode MÉTHODE , utilisez l'inspecteur Inspect.stack.stack () et inspect.geframeinfo () méthodes pour rechercher le cadre de pile qui a provoqué l'appel LOG Dans votre code et extrayez le nom de fichier et les numéros de ligne. Vous pouvez ensuite modifier le message de journal qui a été transmis en conséquence. Enfin, indiquez le module pour utiliser votre sous-classe en appelant logging.setloggerclass () .


3 commentaires

Parce que j'utilise Log4J depuis longtemps, je suis curieux que comment savoir où se produisent un message d'erreur sans nom de paquet?


__ Fichier __ Vous obtient le chemin absolu du fichier source Python à partir duquel le module actuel a été compilé.


Oh, oui, c'est vraiment une solution.



1
votes

Voici un exemple de la manière dont j'ai mis en œuvre ceci: https://github.com/jenstimmerman/vsc -Base / BLOB / MASTER / LIB / VSC / UTILS / FANCYLOGGER.PY

Comme Simon suggère, j'ai étendu à Python Logger pour ajouter des champs personnalisés. Mais vous pouvez également définir simplement une nouvelle fonction getlogger qui fait cela: xxx

mais regarde Fancylogger.py pour un exemple complet de panier.


0 commentaires

5
votes

Je ne sais pas comment obtenir un "nom du paquet" comme Java fait par défaut, mais pour ajouter le nom de fichier (qui vous donne tout autant de contexte), utilisez % (pathname) s dans votre chaîne de format: xxx

Voir la documentation ici: https://docs.python.org/2/library/logging.html#logecord-atributes


0 commentaires

2
votes

Je recommanderais de générer l'enregistreur de votre colis avec logging.getlogger (__ nom __. Split ('.') [0]) Code>, Configurez-le avec un formateur qui inclut le nom code > Paramètre, puis générer ensuite l'enregistreur de votre module avec Logging.getlogger (__ Nom __) code>.

Par exemple: P>

package.another - another message


0 commentaires

0
votes

Il suffit d'utiliser style '{' avec {module} comme expliqué HTTPS: // docs.djangoproject.com/fr/2.2/topics/logging/

Exemple: P>

'formatters': {
    'standard': {
        'format': '{asctime}: [{levelname}] [{name}] [{module}.{funcName} linenr: {lineno}]: {message}',
        'style': '{',
    },
    'report': {
        'format': '{asctime}: [{name}.{module}.{funcName} linenr: {lineno}]: {message}',
        'style': '{',
    },
    'simple': {
        'format': '{levelname} {message}',
        'style': '{',
    },
},


0 commentaires

1
votes

J'ai un fichier utils.py à l'intérieur d'un package appelé commun et il a ci-dessous.

utils.py xxx Tout autre fichier que j'ai besoin d'utiliser le journal, j'utilise ci-dessous. xxx


0 commentaires