2017-10-03 2 views
1

Ich verwende .setFormatter(), um die gleichen logging.Formatter() auf jedem meiner Handler zu setzen.Wie wird das gleiche Protokollierungsformat für alle Handler festgelegt?

Gibt es eine Möglichkeit, ein globales Standardformat festzulegen?

Alternativ - ist es möglich, die bereits über .addHandler() hinzugefügten Handler zu einem Logger zu iterieren?

Another question erwähnt WHAT das Format ist, aber nicht, wie man gesetzt es.

+1

Legen Sie das Format für den globalen Logger und nirgendwo sonst fest. –

+1

Sie können die Liste im Attribut 'handlers' eines Loggers durchlaufen. –

+0

@MadPhysicist: danke. Ich habe es geschafft, über die "Handler" in meinem Logger zu iterieren. Wenn es Ihnen nichts ausmacht, den Kommentar in eine Antwort umzuwandeln, würde ich das gerne akzeptieren. Ich habe den ersten Kommentar jedoch nicht verstanden (über einen "globalen Logger" - was ist das? Meinst du den Logger, der über 'getLogger()' empfangen wurde? Er hat keine 'setFormatter()' Methode) – WoJ

Antwort

0

Der beabsichtigte Weg besteht darin, den Formatierer an jeden Handler anzuhängen, während Sie ihn erstellen.

Da Sie an einem zentralen Ort am Anfang des Hauptprogramms Logging-Ziele einrichten sollen, ist dies nicht so anstrengend.

z. dies ist der Bestand Logging Set-up Code, den ich in meinen Skripte verwenden, die autonom verwaltet werden soll:

# set up logging ##################################### 
import sys,logging,logging.handlers,os.path 
log_file=os.path.splitext(__file__)[0]+".log" 
l = logging.getLogger() 
l.setLevel(logging.DEBUG) 
f = logging.Formatter('%(asctime)s %(process)d:%(thread)d %(name)s %(levelname)-8s %(message)s') 
h=logging.StreamHandler(sys.stdout) 
h.setLevel(logging.NOTSET) 
h.setFormatter(f) 
l.addHandler(h) 
h=logging.handlers.RotatingFileHandler(log_file,maxBytes=1024**2,backupCount=1) 
h.setLevel(logging.NOTSET) 
h.setFormatter(f) 
l.addHandler(h) 
del h,f 
#hook to log unhandled exceptions 
def excepthook(type,value,traceback): 
    logging.error("Unhandled exception occured",exc_info=(type,value,traceback)) 
    #Don't need another copy of traceback on stderr 
    if old_excepthook!=sys.__excepthook__: 
     old_excepthook(type,value,traceback) 
old_excepthook = sys.excepthook 
sys.excepthook = excepthook 
del excepthook,log_file 
# #################################################### 

Es sind andere Methoden, aber jeder hat einen Nachteil:

  • Jeder Logger hat eine nicht dokumentierte <logger>.handlers Liste, aber es listet nur Handler auf, die direkt mit diesem Logger verbunden sind. Also müssen Sie diese Liste für alle Logger durchlaufen, die Sie haben, wenn Sie mehrere haben.
  • Es gibt technisch eine globale logging._handlerList (Verweise auf alle Handler sind dort gehalten, um sie beim Beenden herunterzufahren), aber das ist ein Implementierungsdetail, also würde ich nicht raten, es im Produktionscode zu verwenden.
  • Schließlich können Sie einen Handler init Logik außer Kraft setzen, indem

    • ersetzt __init__ Methoden der Handler und/oder Unterklasse (das wird alles andere beeinflussen, die logging verwendet) oder durch
    • Subklassifizieren/addin a mixin auf die erforderliche Klassen

    Das ist wahrscheinlich ein Overkill.

0

Wenn Sie eine Reihe von Behandlungsroutinen haben, werden Sie geraten Protokollierung konfigurieren, um die logging.config.dictConfig() API. Diese other answer zeigt, wie Formatierer für Handler konfiguriert werden; Sie können es möglicherweise an Ihre Bedürfnisse anpassen.

Verwandte Themen