Python-logging nicht Herunterfahren
Habe ich gelernt das python-logging-Modul, aber habe Probleme bekommen, die Protokollierung auf Herunterfahren, nachdem es fertig ist. Hier ist ein Beispiel -
import logging
log = logging.getLogger()
log.setLevel(logging.INFO)
handler = logging.FileHandler('test.log')
handler.setLevel(logging.INFO)
formatter = logging.Formatter(
fmt='%(asctime)s %(levelname)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
handler.setFormatter(formatter)
log.addHandler(handler)
log.info('log file is open')
logging.shutdown()
log.info('log file should be closed')
Aber das Modul ist stilling Anmeldung nach der Anmeldung.shutdown() als log-Datei sieht wie folgt aus -
# cat test.log
2014-07-17 19:39:35 INFO: log file is open
2014-07-17 19:39:35 INFO: log file should be closed
Laut Dokumentation sollte dieser Befehl "ausführen geordneter shutdown von Spülung und schließen Sie alle Handler". Sollte ich etwas anderes tun, um zu schließen Sie die log-Datei ?
- Ich kann mir vorstellen, dass
shutdown()
in der Tat spült Daten und schließt Handler, aber eine nachträglicheinfo()
Aufruf neu initialisiert Sie mit den gleichen Einstellungen. Niemand verspricht, dassshutdown()
verhindert die weitere Protokollierung; es werden nur Versprechen, dass es sicher ist, den Prozess beenden danach.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Also ich fand, dass die Datei-handler für die Protokollierung ist nicht vollständig Weg gehen, durch die Verwendung von shutdown(). Der beste Weg scheint zu sein, entfernen Sie manuell die Datei-handler -
Den Python-Doc für
shutdown
gibt an, dass:Bedeutet es nicht, dass die logger-Objekt nicht verwendet werden danach. Nach dem Aufruf
shutdown
einfach nicht versuchen, sich etwas anderes mit, das logger-Objekt und das sollte in Ordnung sein.So ist dies der Kampf bin ich. Ich habe ein python, der läuft ein daemon. Der daemon periodisch eine Funktion aufruft. Jedes mal, wenn die Funktion ausgeführt wird, es sollte log-Datei schreiben Sie den Inhalt und schließen Sie es. Da es als daemon läuft es nie heruntergefahren das Programm. Hier ist der test-code.
Aber jedes mal, wenn ich die Ausführung der Funktion wird erzeugt es eine weitere doppelte log-Eintrag, wie so
Jede praktische Möglichkeit, dies zu lösen ?
Hatte ich die gleichen probleme mit der Schaffung eines neuen logger mit jedem Aufruf der Funktion. Eine Lösung, die ich gefunden ist, deaktivieren Sie alle Prozeduren nach der Ausführung der code
Weiß nicht, ob es der richtige Weg, aber es funktioniert für mich.
Hatte ich dieses problem beim schreiben einer tKinter-Anwendung. Ich hatte umfangreiche Protokollierung, wie verschiedene Steuerelemente, die verwendet wurden, und jedes mal, wenn ich (zum Beispiel) gedrückt halten einer bestimmten Taste mehrmals hintereinander, die Anzahl der Male eine Linie angemeldet war, wurde gleich der Anzahl der Male, die ich drückte auf den Knopf nacheinander.
Fügte ich hinzu:
log.handlers.clear()
am Ende von main() und es klärte das Problem auf.