Python-Protokollierung Inkompatibilität zwischen 2,5 und 2,6
-
06-07-2019 - |
Frage
Könnten Sie mir helfen, das folgende Kompatibilitätsproblem zwischen Python zu lösen 2.5 und 2.6?
logger.conf:
[loggers]
keys=root,aLogger,bLogger
[handlers]
keys=consoleHandler
[formatters]
keys=
[logger_root]
level=NOTSET
handlers=consoleHandler
[logger_aLogger]
level=DEBUG
handlers=consoleHandler
propagate=0
qualname=a
[logger_bLogger]
level=INFO
handlers=consoleHandler
propagate=0
qualname=b
[handler_consoleHandler]
class=StreamHandler
args=(sys.stderr,)
module_one.py:
import logging
import logging.config
logging.config.fileConfig('logger.conf')
a_log = logging.getLogger('a.submod')
b_log = logging.getLogger('b.submod')
def function_one():
b_log.info("function_one() called.")
module_two.py:
import logging
import logging.config
logging.config.fileConfig('logger.conf')
a_log = logging.getLogger('a.submod')
b_log = logging.getLogger('b.submod')
def function_two():
a_log.info("function_two() called.")
logger.py:
from module_one import function_one
from module_two import function_two
function_one()
function_two()
Ausgabe des Aufrufs logger.py unter Ubuntu 9.04:
$ python2.5 logger.py
$
$ python2.6 logger.py
function_one() called.
function_two() called.
$
Lösung
Das ist ein Fehler, der zwischen 2,5 und 2,6 festgelegt wurde. Die fileConfig () Funktion wird für einmalige Konfiguration vorgesehen und so sollte nicht mehr als einmal aufgerufen werden - aber Sie wählen, dies zu arrangieren. Das gewünschte Verhalten von fileConfig ist keinen Logger zu deaktivieren, die nicht explizit in der Konfiguration erwähnt werden, und lassen Sie die genannten Logger und ihre Kinder freigegeben; der Fehler verursacht wurde die Kinder deaktiviert werden, wenn sie nicht hätte sein sollen. Das Beispiel Loggers Konfiguration erwähnt Loggern ‚a‘ und ‚b‘; nach dem Aufruf wird getLogger ( ‚a.submod‘) ein Kind Logger erstellt. Der zweite fileConfig Aufruf deaktiviert falsch dieses in Python 2.5 -. In Python 2.6 der Logger nicht deaktiviert, wie es ein Kind von einem Logger ist explizit in der Konfiguration erwähnt
Andere Tipps
Ich verstehe nicht, die Gründe für dieses Verhalten selbst, aber wie Sie auch in 2.6 angegebenen es funktioniert anders. Wir können davon ausgehen, dies ist ein Bug zu beeinflussen 2.5
Als Abhilfe Ich schlage vor, die folgenden:
extra_module.py:
import logging
import logging.config
logging.config.fileConfig('logger.conf')
a_log = logging.getLogger('a.submod')
b_log = logging.getLogger('b.submod')
module_one.py:
from extra_module import a_log
def function_one():
a_log.info("function_one() called.")
module_two.py:
from extra_module import b_log
def function_two():
b_log.info("function_two() called.")
durch dieses Schema mit mir in der Lage war zu laufen logger.py auf python2.5.4 mit dem gleichen Verhalten wie von 2,6
Interessante ... spielte ich ein wenig in der Konsole und es sieht aus wie der zweite Aufruf von logging.config.fileConfig
wird Dinge mucking. wenn auch nicht sicher, warum das so ist ... Hier ist ein Transkript, das das Problem zeigt:
lorien$ python2.5
Python 2.5.1 (r251:54863, Feb 6 2009, 19:02:12)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import logging
>>> import logging.config
>>> logging.config.fileConfig('logger.conf')
>>> alog = logging.getLogger('a.submod')
>>> alog.info('foo')
foo
>>> import logging
>>> import logging.config
>>> alog.info('foo')
foo
>>> logging.config.fileConfig('logger.conf')
>>> alog.info('foo')
>>> alog = logging.getLogger('a.submod')
>>> alog.info('foo')
>>>
>>> blog = logging.getLogger('b.submod')
>>> blog.info('foo')
foo
>>>
Sobald ich logging.config.fileConfig
das zweite Mal anrufen, meine Logger Instanz beendet Protokollierung. keine neue Logging-Instanz Grabbing helfen, da es das gleiche Objekt ist. Wenn ich bis nach der beide Male warten Konfiguration der Logger-Instanzen zu holen, dann die Dinge funktionieren - das ist, warum die blog
Instanz funktioniert
Mein Vorschlag ist es, die Logger-Instanzen zu verzögern greifen, bis Sie in den Funktionen sind. Wenn Sie die Anrufe logging.getLogger()
in function_one
und function_two
bewegen, dann funktioniert alles gut.
Ich war in der Lage, dies zu beheben, indem Sie die Namen der Logger wie so ändern, in beiden Dateien:
logging.config.fileConfig('logger.conf')
a_log = logging.getLogger('a')
b_log = logging.getLogger('b')
Ich bin mir nicht sicher über den genauen Fehler, aber der v2.5-Logger Modul scheint bestanden Probleme passenden Namen zu haben, mit Namen in der Konfigurationsdatei getLogger()
.