J'utilise Pythons La configuration de la journalisation est la suivante: p> } p> Et je reçois un enregistreur comme celui-ci: p> Loging code> 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?
6 Réponses :
Je vois deux solutions au problème. P>
Un, transmettez-le dans le nom de fichier avec chaque appel au journal. [Débogage, info, erreur, ...] comme obtenu par le fichier Deux, faire une sous-classe de __ (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. P>
Logging.logger code> qui remplace la méthode de l'instance
logger.log code>. Dans votre nouvelle méthode CODE> MÉTHODE CODE>, utilisez l'inspecteur
Inspect.stack.stack () code> et
inspect.geframeinfo () code> méthodes pour rechercher le cadre de pile qui a provoqué l'appel
LOG CODE> 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 code> code> pour utiliser votre sous-classe en appelant
logging.setloggerclass () code>. P>
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 __ Code> Vous obtient le chemin absolu du fichier source Python à partir duquel le module actuel a été compilé.
Oh, oui, c'est vraiment une solution.
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: p> mais regarde Fancylogger.py pour un exemple complet de panier. P> p>
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 Voir la documentation ici: https://docs.python.org/2/library/logging.html#logecord-atributes p> p> % (pathname) s code> dans votre chaîne de format:
Je recommanderais de générer l'enregistreur de votre colis avec Par exemple: P> 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>.
package.another - another message
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': '{', }, },
J'ai un fichier utils.py à l'intérieur d'un package appelé commun et il a ci-dessous.
utils.py em> p> Tout autre fichier que j'ai besoin d'utiliser le journal, j'utilise ci-dessous. p>
Qu'entendez-vous par «nom de paquet» qui est différent de ce que
% (module) s code> produit?