Viele Anwendungen verfügen über ein Protokollmodul, das zur Aufzeichnung einiger wichtiger Informationen während des Betriebs des Systems verwendet wird, um die Verfolgung des Betriebsstatus des Systems zu erleichtern. In Python benötigen wir keine Protokollierungskomponenten von Drittanbietern, da es uns bereits ein einfaches, benutzerfreundliches und leistungsstarkes Protokollierungsmodul zur Verfügung stellt: Protokollierung.
Python druckt alle Attributwerte des Objekts:
def prn_obj(obj): print '\n'.join(['%s:%s' % item for item in obj.__dict__.items()])
Python-Logger-Objektattribute (erhalten durch die oben genannten). Funktion)
name:get_data parent:<logging.RootLogger instance at 0x1d8bd88> handlers:[<logging.FileHandler instance at 0x21bcc68>] level:10 disabled:1 #当前的logger是否有效,默认为0 manager:<logging.Manager instance at 0x1d8bea8> propagate:0 #是否将本级日志 filters:[]
Einige Protokolle können nicht ausgegeben werden
Datei: logger.conf
[formatters] keys=default [formatter_default] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s class=logging.Formatter [handlers] keys=console, error_file [handler_console] class=logging.StreamHandler formatter=default args=tuple() [handler_error_file] class=logging.FileHandler level=INFO formatter=default args=("logger.log", "a") [loggers] keys=root [logger_root] level=DEBUG formatter=default handlers=console,error_file
Datei: logger.py
#!/bin/env python import logging from logging.config import logging class Test(object): """docstring for Test""" def __init__(self): logging.config.fileConfig("logger.conf") self.logger = logging.getLogger(__name__) def test_func(self): self.logger.error('test_func function') class Worker(object): """docstring for Worker""" def __init__(self): logging.config.fileConfig("logger.conf") self.logger = logging.getLogger(__name__) data_logger = logging.getLogger('data') handler = logging.FileHandler('./data.log') fmt = logging.Formatter('%(asctime)s|%(message)s') handler.setFormatter(fmt) data_logger.addHandler(handler) data_logger.setLevel(logging.DEBUG) self.data_logger = data_logger def test_logger(self): self.data_logger.error("test_logger function") instance = Test() self.data_logger.error("test_logger output") instance.test_func() def main(): worker = Worker() worker.test_logger() if __name__ == '__main__': main()
Frage 1: Während der test, nur Drucken Sie eine Anweisung der test_logger-Funktion aus
Frage 2: Offensichtlich wird nur die Anweisung in data_logger gedruckt, aber verwandte Protokolle werden auch im Protokoll des Loggers angezeigt.
Lösung für Problem 1:
Verwenden Sie die Anweisung python -m pdb logger.py, um das Skript zu debuggen und stellen Sie fest, dass nach dem Ausführen der Anweisung „instance = Test()“ über print 'n ' .join(['%s:%s' % item for item in self.data_logger.__dict__.items()]) Die Debugging-Anweisung zeigt, dass sich der Wert des Deaktivierungsattributs von data_logger von 0 auf True geändert hat Das entsprechende Attribut des Loggers hat sich ebenfalls geändert. Die gleichen Änderungen sind aufgetreten. Diese Änderung führt dazu, dass das Logger-Objekt die Protokollierung stoppt. Unter Bezugnahme auf das entsprechende Handbuch des Python-Protokollierungsmoduls habe ich herausgefunden, dass „die Funktion fileConfig() einen Standardparameter, disable_existing_loggers, verwendet, der aus Gründen der Abwärtskompatibilität standardmäßig auf True gesetzt ist. Dies kann das sein, was Sie wollen, oder auch nicht, da es so sein wird.“ bewirkt, dass alle vor dem fileConfig()-Aufruf vorhandenen Logger deaktiviert werden, es sei denn, sie (oder ein Vorfahre) werden in der Konfiguration explizit genannt.“ Das heißt, durch den Aufruf der Funktion fileconfig() werden alle zuvor vorhandenen Logger deaktiviert. In der Python 2.7-Version fügt die Funktion „fileConfig()“ einen Parameter hinzu, logging.config.fileConfig(fname, defaults=None, unlock_existing_loggers=True), der „disable_existing_loggers“ explizit auf FALSE setzen kann, um eine Deaktivierung des ursprünglichen Loggers zu vermeiden. Durch Ändern der Funktion logging.config.fileConfig in der Testklasse im obigen Code in logging.config.fileConfig("./logger.conf", disable_existing_loggers=0) kann das Problem gelöst werden. Da sich dieser Code jedoch im selben Programm befindet, können Sie die Funktion logging.getLogger(LOGGOR_NAME) direkt verwenden, um auf denselben Logger zu verweisen, ohne die Funktion logging.config.fileConfig aufzurufen, um ihn neu zu laden.
Lösung für Problem 2:
Das Logger-Objekt verfügt über ein Attribut propagieren. Wenn dieses Attribut True ist, werden die auszugebenden Informationen an alle übergeordneten Logger des Loggers weitergeleitet. Diese übergeordneten Handler, die dem Logger entsprechen, drucken die empfangenen Informationen in das zugehörige Protokoll. Die zugehörigen Root-Logger-Attribute werden in der Konfigurationsdatei logger.conf konfiguriert. Dieser Root-Logger ist das Standard-Logger-Protokoll.
Die geänderten sind wie folgt:
Datei: logger.conf
[formatters] keys=default, data [formatter_default] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s class=logging.Formatter [formatter_data] format=%(asctime)s|%(message)s class=logging.Formatter [handlers] keys=console, error_file, data_file [handler_console] class=logging.StreamHandler formatter=default args=tuple() [handler_error_file] class=logging.FileHandler level=INFO formatter=default args=("logger.log", "a") [handler_data_file] class=logging.FileHandler level=INFO formatter=data args=("data_new.log", "a") [loggers] keys=root, data [logger_root] level=DEBUG handlers=console,error_file [logger_data] level=DEBUG handlers=data_file qualname=data propagate=0
Datei: logger.py
#!/bin/env python import logging from logging.config import logging class Test(object): """docstring for Test""" def __init__(self): self.logger = logging.getLogger(__name__) def test_func(self): self.logger.error('test_func function') class Worker(object): """docstring for Worker""" def __init__(self): logging.config.fileConfig("logger.conf") self.logger = logging.getLogger(__name__) self.data_logger = logging.getLogger('data') def test_logger(self): self.data_logger.error("test_logger function") instance = Test() self.data_logger.error("test_logger output") instance.test_func() def main(): worker = Worker() worker.test_logger() if __name__ == '__main__': main()
Weitere Beispiele für Python-Protokollierungsmodule und verbesserungsbezogene Artikel finden Sie auf der chinesischen PHP-Website!