Eine Geschichte über das Ändern der Darstellung von Protokollen, die vom Protokollierungsmodul von Python ausgegeben werden. Es gibt ungefähr drei Möglichkeiten
Im Protokollierungsmodul von Python können Sie die Darstellung der Ausgabe ändern, indem Sie das Format ändern.
import logging
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.DEBUG)
logger.info("hello")
logger.info("bye")
Wenn Sie logging.basicConfig ()
verwenden, ohne etwas festzulegen, lautet die Ausgabe wie folgt.
INFO:__main__:hello
INFO:__main__:bye
Sie können die Anzeige ändern, indem Sie den Formatierer ändern. Die Änderung selbst kann auch durch Hinzufügen der Formatoption zu basicConfig vorgenommen werden.
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")
Die Ausgabe wird wie folgt sein.
2016-10-10 19:49:50,692 INFO __main__ :hello
2016-10-10 19:49:50,693 INFO __main__ :bye
Sie können standardmäßig tun, was Sie können. Die folgenden Informationen können hinzugefügt werden.
--asctime --current time
--levelname --Log Level (z. B. DEBUG, INFO, ERROR, ...)
--message --Message (Zeichenfolge an logger.info ()
usw. übergeben)
--pathname - Der physische Pfad (absoluter Pfad), von dem aus das Protokoll aufgerufen wurde
--funcName - Der Name der Funktion, von der das Protokoll aufgerufen wurde
Siehe unten für Details.
http://docs.python.jp/3/library/logging.html#logrecord-attributes
Es ist möglich, zusätzliche Informationen zum Zeitpunkt der Ausgabe hinzuzufügen, indem bei jeder Ausgabe des Protokolls zusätzliche Informationen übergeben werden. Geben Sie insbesondere die zusätzliche Option an.
Der Wert im Diktat, der durch die zusätzliche Option angegeben wird, wird vom Formatierer der Protokollausgabe berührt. (Um genau zu sein, wird es in __dict__
des LogRecord-Objekts gespeichert.)
Aktualisieren wir beispielsweise die Informationen zu Wer und Kosten wie folgt. Sie können die Mini-Sprachnotation von Formatzeichenfolgen grob zum Formatieren von Zeichenfolgen verwenden.
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})
Die Ausgabe wird wie folgt sein.
hello [who=foo cost=2.48451]
bye [who=foo cost=0.79263]
Beachten Sie übrigens, dass KeyError auftritt, wenn Informationen fehlen.
logger.info("noop") # KeyError: 'who'
Es gibt Zeiten, in denen Sie immer bestimmte Informationen hinzufügen möchten, anstatt sie jedes Mal weiterzugeben. In diesem Fall ist es besser, LogRecordFactory zu ändern.
Fügen wir beispielsweise die Anzahl der Protokolle derselben Nachricht (gezählt nach fmt-Zeichenfolge) mit dem Namen call_count hinzu und zeigen sie an.
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")
Die Ausgabe wird wie folgt sein.
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