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.
Legen Sie das Format für den globalen Logger und nirgendwo sonst fest. –
Sie können die Liste im Attribut 'handlers' eines Loggers durchlaufen. –
@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