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.
$
War es hilfreich?

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().

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top