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
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
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
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'
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]