Comment générer des informations supplémentaires lors de la sortie de journaux avec le module de journalisation de python

introduction

Une histoire sur la modification de la représentation des journaux produits par le module de journalisation de python. Il y a environ trois façons

Sortie de journal supplémentaire dans la mesure prise en charge par défaut

Sortie lorsque rien n'est défini

Dans le module de journalisation de python, vous pouvez changer la représentation de la sortie en changeant le format.

import logging
logger = logging.getLogger(__name__)

logging.basicConfig(level=logging.DEBUG)

logger.info("hello")
logger.info("bye")

Si vous utilisez logging.basicConfig () sans rien paramétrer, la sortie sera la suivante.

INFO:__main__:hello
INFO:__main__:bye

Lorsque le formateur utilisé pour la sortie du journal est modifié

Vous pouvez modifier l'affichage en changeant le formateur. Le changement lui-même peut également être effectué en ajoutant l'option de format à basicConfig.

import logging
logger = logging.getLogger(__name__)

fmt = "%(asctime)s %(levelname)s %(name)s :%(message)s"
logging.basicConfig(level=logging.DEBUG, format=fmt)
# logging.root.handlers[0].setFormatter(logging.Formatter(fmt=fmt))


logger.info("hello")
logger.info("bye")

La sortie sera la suivante.

2016-10-10 19:49:50,692 INFO __main__ :hello
2016-10-10 19:49:50,693 INFO __main__ :bye

Vous pouvez faire ce que vous pouvez par défaut. Les informations suivantes peuvent être ajoutées.

--asctime - heure actuelle --levelname --Niveau du journal (par exemple DEBUG, INFO, ERROR, ...) --message --Message (chaîne de caractères passée à logger.info () etc.) --pathname --Le chemin physique (chemin absolu) à partir duquel le journal a été appelé --funcName --Le nom de la fonction à partir de laquelle le journal a été appelé

Voir ci-dessous pour plus de détails.

http://docs.python.jp/3/library/logging.html#logrecord-attributes

Sortie de journal en transmettant des informations supplémentaires lors de la transmission de la sortie de journal

Il est possible d'ajouter des informations supplémentaires au moment de la sortie en transmettant des informations supplémentaires à chaque sortie du journal. Spécifiquement, spécifiez l'option supplémentaire. La valeur dans le dict spécifié par l'option supplémentaire sera touchée par le formateur de la sortie du journal. (Pour être exact, il sera conservé dans __dict__ de l'objet LogRecord)

Par exemple, mettons à jour les informations sur qui et le coût comme suit. Vous pouvez à peu près utiliser la notation mini-langue des chaînes de format pour la mise en forme des chaînes.

import logging
import random
logger = logging.getLogger(__name__)

fmt = "%(message)10s [who=%(who)s cost=%(cost).5f]"
logging.basicConfig(level=logging.DEBUG, format=fmt)

logger.info("hello", extra={"who": "foo", "cost": random.random() * 5})
logger.info("bye", extra={"who": "foo", "cost": random.random() * 5})

La sortie sera la suivante.

     hello [who=foo cost=2.48451]
       bye [who=foo cost=0.79263]

En passant, notez que KeyError se produira s'il manque des informations.

logger.info("noop")  # KeyError: 'who'

Sortie de journal avec des informations spécifiques ajoutées à toutes les sorties de journal

Il y a des moments où vous souhaitez toujours ajouter certaines informations au lieu de les transmettre à chaque fois. Dans ce cas, il est préférable de modifier LogRecordFactory.

Par exemple, ajoutons le nombre de journaux du même message (compté par la chaîne de caractères fmt) appelé call_count et affichons-le.

import logging
from collections import defaultdict
logger = logging.getLogger(__name__)


class Extension:
    def __init__(self):
        self.c = defaultdict(int)


class LogRecordExtension(logging.LogRecord):
    extension = Extension()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.extension.c[self.msg] += 1
        self.call_count = self.extension.c[self.msg]


if __name__ == "__main__":
    logging.basicConfig(level=logging.DEBUG, format="%(asctime)s %(levelname)s %(message)s[%(call_count)d]")
    logging.setLogRecordFactory(LogRecordExtension)

    logger.info("hello")
    logger.info("hello")

    logger.info("%s: hello", "foo")
    logger.info("%s: hello", "bar")

La sortie sera la suivante.

2016-10-10 20:01:33,337 INFO hello[1]
2016-10-10 20:01:33,338 INFO hello[2]
2016-10-10 20:01:33,338 INFO foo: hello[1]
2016-10-10 20:01:33,338 INFO bar: hello[2]

Recommended Posts

Comment générer des informations supplémentaires lors de la sortie de journaux avec le module de journalisation de python
Comment utiliser le module de journalisation de Python
Comment mettre à jour les informations utilisateur sur Django RemoteUserMiddleware login
Comment gérer les erreurs en frappant pip ②
Comment lire un tableau avec ConfigParser de Python
Comment créer des nombres aléatoires avec le module aléatoire de NumPy
Comment accéder avec cache lors de la lecture_json avec pandas
Comment générer un CSV d'en-tête multiligne avec des pandas
[Python-pptx] Afficher les informations de police PowerPoint au format csv avec python
Gestion des fichiers statiques lors du déploiement en production avec Django
Comment sortir un document au format pdf avec Sphinx
Connaissances minimales pour démarrer avec le module de journalisation Python
Comment ne pas charger d'images lors de l'utilisation de PhantomJS avec Selenium
Comment imprimer des caractères sous forme de tableau avec la fonction d'impression de Python
Comment mettre à jour avec SQLAlchemy?
Comment résoudre la protection CSRF lors de l'utilisation d'AngularJS avec Django
Comment lancer avec Theano
Comment modifier avec SQLAlchemy?
Comment séparer les chaînes avec ','
Comment faire RDP sur Fedora31
[GCP] Comment générer des journaux Cloud Functions vers Cloud Logging (Stackdriver Logging) (Python)
Comment gérer UnicodeDecodeError lors de l'exécution du téléchargement d'image Google
Comment supprimer avec SQLAlchemy?
Comment traiter l'erreur "Impossible de charger le module" canberra-gtk-module "qui apparaît lorsque vous exécutez OpenCV
Comment ne pas échapper au japonais en traitant avec JSON en Python
Comment gérer les erreurs lors de l'installation de whitenoise et du déploiement sur Heroku
Comment gérer les erreurs lors de l'installation de Python et de pip avec choco
[Astuces] Comment étendre le modèle lors de la création de HTML avec django
Python: comment utiliser async avec
Comment utiliser le module optparse
Sortie vers un fichier csv avec Python
Pour utiliser virtualenv avec PowerShell
Comment installer python-pip avec ubuntu20.04LTS
Comment gérer les données déséquilibrées
Comment ajouter sudo lors de l'exécution du débogage
Trier les noms avec le module aléatoire de Python
Comment démarrer avec Scrapy
Comment démarrer avec Python
Comment gérer l'erreur DistributionNotFound
Comment démarrer avec Django
Comment écraser la sortie sur la console
Comment calculer la date avec python
Comment installer mysql-connector avec pip3
Essayez de produire de l'audio avec M5 STACK
Comment utiliser le module ConfigParser
Comment installer Anaconda avec pyenv
Comment utiliser le gestionnaire de contexte de Python
[COMMENT FAIRE] Un moyen facile de déboguer lors de la génération d'un fichier PDF avec PHP, etc.
[PostgreSQL] Comment accorder une autorité de superutilisateur lorsque le nombre d'utilisateurs (rôles) avec l'autorité de superutilisateur est de 0.
[Yahoo! Weather Replacement Version] Comment obtenir des informations météo avec LINE Notify + Python
Comment gérer l'erreur OAuth2 lors de l'utilisation des API Google à partir de Python