Beispiele und Verbesserungen für das Python-Protokollierungsmodul

高洛峰
Freigeben: 2017-02-14 13:46:51
Original
1549 Leute haben es durchsucht

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()])
Nach dem Login kopieren

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:[]
Nach dem Login kopieren

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
Nach dem Login kopieren

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(&#39;test_func function&#39;)
 
class Worker(object):
  """docstring for Worker"""
  def __init__(self):
    logging.config.fileConfig("logger.conf")
    self.logger = logging.getLogger(__name__)
 
    data_logger = logging.getLogger(&#39;data&#39;)
    handler = logging.FileHandler(&#39;./data.log&#39;)
    fmt = logging.Formatter(&#39;%(asctime)s|%(message)s&#39;)
    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__ == &#39;__main__&#39;:
  main()
Nach dem Login kopieren

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
Nach dem Login kopieren

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(&#39;test_func function&#39;)
 
class Worker(object):
  """docstring for Worker"""
  def __init__(self):
    logging.config.fileConfig("logger.conf")
    self.logger = logging.getLogger(__name__)
    self.data_logger = logging.getLogger(&#39;data&#39;)
 
  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__ == &#39;__main__&#39;:
  main()
Nach dem Login kopieren

Weitere Beispiele für Python-Protokollierungsmodule und verbesserungsbezogene Artikel finden Sie auf der chinesischen PHP-Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!