2016-04-07 9 views
0

Wie hier erwähnt https://stackoverflow.com/a/4150322/1526342. Bei der Protokollierung an die Kinderprotokollfunktion wird die Nachricht an ihr übergeordnetes Element weitergegeben, und das übergeordnete Element leitet die Nachricht an die Stammprotokollfunktion weiter. Betrachtet man nun das folgende BeispielPython-Kind-Logger sollte zurück zum Root-Logger melden, anstatt seine eigenen Logging-Konfigurationen anzuwenden

import logging 
import logging.handlers 
child_logger = logging.getLogger(__name__) 
f = logging.Formatter(
     fmt='%(asctime)s; %(name)s; % (filename)s:%(lineno)d:%(message)s', 
     datefmt="%Y-%m-%d %H:%M:%S") 
handler = logging.handlers.RotatingFileHandler('/tmp/info.log', 
               encoding='utf8', 
               maxBytes=500000000, 
               backupCount=5) 
handler.setFormatter(f) 
child_logger.setLevel(logging.INFO) 
child_logger.addHandler(handler) 
child_logger.info('1 + 1 is %d', 1+1) 

child_logger sollte der Wurzellogger berichtet zurück, anstatt den Druck der Ausgabe in der Protokolldatei des child_logger.

Ich bin verwirrt.

Antwort

2

Wie in this logging flow chart gezeigt, passieren Logger Protokollsätze beide Handler zu besitzen und zu Logger Objekte Eltern. Versuchen Sie, einen Handler zum Parent-Logger hinzuzufügen. Der Protokolleintrag wird dort ebenfalls verarbeitet.

0

In diesem Fall ist Ihr 'child_logger' Ihr Root-Logger. Wenn Sie es wie so initialisiert hatte:

logger = getLogger('root') 
child_logger = getLogger('root.child') 

child_logger ist ein Kind von logger wie definiert durch:

Der Name ist möglicherweise eine Periode getrennten hierarchischen Wert, wie foo.bar.baz (obwohl es könnte auch einfach nur foo sein, zum Beispiel). Logger, die weiter unten in der hierarchischen Liste sind, sind Kinder von Loggern, die weiter oben in der Liste sind. Wenn Sie beispielsweise einen Logger mit dem Namen foo verwenden, sind Logger mit den Namen foo.bar, foo.bar.baz und foo.bam alle Nachkommen von foo. Die Loggernamenshierarchie ist analog zur Python-Pakethierarchie und identisch mit dieser, wenn Sie Ihre Logger pro Modul mit der empfohlenen Konstruktion logging.getLogger (__name__) organisieren. Das liegt daran, dass __name__ in einem Modul der Name des Moduls im Python-Paketnamespace ist.

Wenn Sie nicht möchten, dass ein Kind sich ausbildet, können Sie logger.propagate = False setzen.

Außerdem, wenn Sie möchten, dass nur bestimmte Ebenen geschrieben, um Ihr Kind-Logger-Datei (dh nur debug), aber Sie wollen höhere Ebene noch propagieren Sie eine Unterklasse eines Handlers erstellen könnte, wie in meinem hier:

from logging import DEBUG, INFO, WARN, ERROR, CRITICAL, handlers 

class DebugRotatingFileHandler(handlers.RotatingFileHandler): 
    def __init__(self, filename, mode, maxBytes, backupCount, encoding, delay): 
     super(DebugRotatingFileHandler, self).__init__(
        self, filename, mode, maxBytes, backupCount, encoding, delay) 

    def emit(self, record): 
     if record.levelno != DEBUG: 
      return 
     super(DebugRotatingFileHandler, self).emit(self, record) 

(Ja, ich weiß, dass es einige Verbesserungen, die gemacht werden können, ist dieser alte Code.)

zum Beispiel debug_logger.info("Info Message") Ausführung nichts zu den debug_logger des angegebenen Datei würde drucken, aber wenn root_logger ‚s Niveau war auf info eingestellt oder debuggen, es würde es in seiner Datei ausdrucken. Ich benutze dies für die Debug-Protokollierung, während ich immer noch die Möglichkeit behalte, dass der Logger Fehlermeldungen aufruft und diese in das Root-Protokoll schreibt.

Verwandte Themen