Effiziente Möglichkeit der Einstellung der Protokollierung über ein Paket-Modul
Habe ich ein Paket mit mehreren Komponenten, die in es wäre von großem nutzen, verwenden der Protokollierung und der Ausgabe nützliche Informationen.
Was ich nicht wollen, zu tun ist, um "setup" die richtige Protokollierung für jede einzelne Datei mit irgendwo entlang dieser Linien:
import logging
logging.basicConfig(level=DEBUG)
my_function = logging.getLogger("my_function")
my_class = logging.getLogger("my_class")
Ich habe versucht, ein paar Ansätze, einer davon ist das hinzufügen der boilerplate-code in eine Klasse innerhalb eines Dienstprogramm-Modul und versuchen, so etwas wie dieses:
from util import setlogging
set_logging()
Aber auch die oben genannte Lösung nicht sauber Aussehen zu mir und würde Probleme verursachen, weil setLogger nicht __call__
Methode. Was ich gemacht habe, gefallen hat, war, dass mein "set_logging" - Klasse Lesen würde bilden eine config-Datei und einige default-Werte, so wäre es nicht egal, welches level oder welche Art von logging-format, das ich wollte, es würden stellen Sie es richtig.
Gibt es eine Möglichkeit zu initialisieren ordnungsgemäße Protokollierung über das board in mein Paket? Vielleicht in der __init__.py
- Datei?
Und nur so ausführlich wie möglich, das ist, was setlogging (jetzt eine Funktion, nicht die Klasse) sieht wie folgt aus:
def setlogging(config=None):
if config == None:
config = config_options() # sets default values
levels = {
'debug': DEBUG,
'info': INFO
}
level = levels.get(config['log_level'])
log_format = config['log_format']
datefmt = config['log_datefmt']
basicConfig(
level = level,
format = log_format,
datefmt = datefmt)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, dass alle den code in die verschiedenen Module des Pakets für die Verwendung der gleichen logger-Objekt, die Sie gerade brauchen, um (machen Sie, dass die logger zur Verfügung -- siehe unten -- und) call
oder dergleichen, eher als
logging.warning
&c. So, das problem reduziert, was zu einemmylogger
- Objekt für das ganze Paket und verfügbar zu machen während der Module in das Paket. (Alternativ könnten Sie auch verwendet, namens-Logger, die mit Namen, beginnend mit dem Paket den Namen gefolgt von einem Punkt, aber während das ist sehr viel ein Teil deslogging
Paket Funktionen, ich persönlich habe noch nie fand es eine Natürliche Art und Weise zu betreiben).So, Ihr
util.setlogging
Funktion könnte einfach sein, gefolgt von, sagen wir,und jedes Modul, dass die Einfuhren
util
einfachund dergleichen. Dies scheint mir der einfachste Ansatz, solange das Konzept, dass alle den code in das Paket sollten Sie die Protokollierung in der gleichen Weise gilt.
__init__.py
wäre der einfachste Ort für den Zweck, da Sie wissen, dass es immer ausgeführt wird, bevor der code in einem beliebigen Modul in das Paket), und natürlich können Sie hinzufügen, dass der logger einen handler, der mit seinen formatter konfiguriert, wie Sie bitte, wie im Beispiel code unter docs.python.org/library/... .Den richtigen Weg für ein Modul zu verwenden ist die Protokollierung von
und
wird ein no-op, bis jemand ruft
logging.basicConfig()
(oder eine Variante).