Es ist sicherlich möglich, fileConfig()
zu verwenden, um Protokollierungskonfiguration im laufenden Betrieb zu ändern, obwohl für einfache Änderungen ein programmatischer Ansatz, wie in Martijn Pieters Antwort vorgeschlagen, angemessen sein könnte. Die Protokollierung bietet sogar einen Socket-Server, der die Konfigurationsänderungen unter Verwendung der listen()
/stopListening()
APIs überwacht, wie in der Dokumentation here dokumentiert. Zu erhalten Anmeldung an einem bestimmten Port zu hören, verwenden Sie
t = logging.config.listen(PORT_NUMBER)
t.start()
und hören zu stoppen, rufen
logging.config.stopListening()
Um Daten an den Server zu senden, können Sie zum Beispiel
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', PORT_NUMBER))
with open(CONFIG_FILE) as f:
data_to_send = f.read()
s.send(struct.pack('>L', len(data_to_send)))
s.send(data_to_send)
s.close()
Update: Aufgrund der Abwärtskompatibilität Zwänge, die interne Implementierung der fileConfig()
Anruf bedeutet, dass Sie nicht disable_existing_loggers=False
im Aufruf angeben können, die diese Funktion weniger nützlich in bestimmten Szenarien macht. Sie können die gleiche API verwenden, um eine JSON-Datei mithilfe des dictConfig-Schemas zu senden, was eine bessere Kontrolle über die Neukonfiguration ermöglicht. Dies erfordert Python 2.7/3.2 oder höher (wobei dictConfig()
hinzugefügt wurde). Oder Sie können den stdlib-Code verwenden, um Ihren eigenen Listener zu implementieren, der auf die gleiche Weise funktioniert, aber auf Ihre speziellen Anforderungen zugeschnitten ist.
Jeder Threads und Timer mit der Protokollierungsstufe zurückgesetzt werden. Dafür wurden Signale erfunden. Sie können einen Prozess mit "SIGHUP" (der Standard für * nix) signalisieren, um die Konfiguration neu zu laden. In Python können Sie einen Signal-Handler installieren, der diesen (Ereignis-Laufwerk) fängt und somit eine Konfiguration neu lädt oder zurücksetzt. –
Ich stimme der Verwendung von Signalen zu. Verwenden Sie SIGUSR1 oder SIGUSR2 zu diesem Zweck anstelle von SIGHUP. Letzteres wird gesendet, wenn das steuernde Terminal eines Prozesses getrennt wird. –