Вопрос по python – Несовместимость журналирования Python между 2.5 и 2.6

6

Не могли бы вы помочь мне решить следующую проблему несовместимости между Python 2.5 и 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()

Вывод вызова logger.py под Ubuntu 9.04:

$ python2.5 logger.py
$

$ python2.6 logger.py
function_one() called.
function_two() called.
$

Ваш Ответ

4   ответа
0

изменив имена регистраторов, например, в обоих файлах:

logging.config.fileConfig('logger.conf')
a_log = logging.getLogger('a')
b_log = logging.getLogger('b')

Я не уверен в точной ошибке, но у модуля регистратора v2.5, кажется, есть проблемы с сопоставлением имен, переданных вgetLogger() с именами в конфигурационном файле.

1

но, как вы хорошо заявили в 2.6, оно работает по-другому. Мы можем предположить, что это ошибка, затрагивающая 2.5

В качестве обходного пути я предлагаю следующее:

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

с помощью этой схемы я смог запустить logger.py на python2.5.4 с тем же поведением, что и в версии 2.6

Error: User Rate Limit Exceeded Szilveszter
8

которая была исправлена между 2.5 и 2.6. Функция fileConfig () предназначена для одноразовой конфигурации и поэтому не должна вызываться более одного раза - однако вы решаете это организовать. Предполагаемое поведение fileConfig заключается в отключении любых регистраторов, которые явно не упомянуты в конфигурации, и оставлении включенными упомянутых регистраторов и их дочерних элементов; ошибка приводила к тому, что дети были отключены, когда им не следовало этого делать. В примере конфигурации логгера упоминаются логгеры «а»; и 'b'; после вызова getLogger («a.submod») создается дочерний регистратор. Второй вызов fileConfig неправильно отключает это в Python 2.5 - в Python 2.6 регистратор не отключен, поскольку он является дочерним по отношению к регистратору, явно указанному в конфигурации.

Error: User Rate Limit Exceeded Szilveszter
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededhas to be rightError: User Rate Limit Exceeded
0

logging.config.fileConfig все портит. Не уверен, почему это так ... Вот расшифровка, которая показывает проблему:

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
>>>

Как только я позвонюlogging.config.fileConfig во второй раз мой экземпляр журнала останавливает запись. Захват нового экземпляра журнала не помогает, поскольку это один и тот же объект. Если я подожду до тех пор, пока не настрою оба раза для извлечения экземпляров регистратора, то все будет работать - вот почемуblog экземпляр работает.

Я предлагаю отложить захват экземпляров регистратора до тех пор, пока вы не перейдете в функции. Если вы переместите вызовы вlogging.getLogger() вfunction_one а такжеfunction_two, тогда все работает хорошо.

Похожие вопросы