Pergunta

Você poderia me ajudar a resolver o seguinte problema de incompatibilidade entre Python 2.5 e 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()

Saída de logger.py chamando sob Ubuntu 9.04:

$ python2.5 logger.py
$

$ python2.6 logger.py
function_one() called.
function_two() called.
$
Foi útil?

Solução

Este é um bug que foi fixada entre 2,5 e 2,6. A função fileConfig () destina-se a one-off configuração e por isso não deve ser chamado mais de uma vez - no entanto que você escolher para organizar isso. O comportamento pretendido do fileConfig é a desativar todos os madeireiros que não são explicitamente mencionados na configuração e licença permitiu que os madeireiros mencionado e seus filhos; o bug estava causando as crianças a ser desativado quando eles não deveriam ter sido. A configuração de exemplo menciona registador registadores 'a' e 'b'; depois de chamar getLogger ( 'a.submod') é criado um registrador de criança. A segunda chamada fileConfig erroneamente desabilita isso em Python 2.5 -. Em Python 2.6 do logger não está desativada, pois é uma criança de um logger explicitamente mencionado na configuração

Outras dicas

Eu não entendo as razões deste comportamento mim, mas como você bem disse em 2.6 funciona de forma diferente. Podemos supor que este é um bug que afeta 2,5

Como alternativa, sugiro o seguinte:

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

usando este esquema eu era capaz de executar logger.py em python2.5.4 com o mesmo comportamento de 2,6

Interessante ... Joguei um pouco no console e parece que a segunda chamada para logging.config.fileConfig está sujando as coisas. Não sei por que este é embora ... Aqui está uma transcrição que mostra o problema:

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

Assim que eu chamo logging.config.fileConfig pela segunda vez, minha instância do registrador pára de registro. Agarrando uma nova instância de registro não ajuda, já que é o mesmo objeto. Se eu esperar até depois de configurar ambas as vezes para buscar os casos registador, então as coisas trabalho -. É por isso que as obras exemplo blog

A minha sugestão é para atrasar agarrando as instâncias logger até que você esteja nas funções. Se você mover as chamadas para logging.getLogger() em function_one e function_two, então tudo funciona bem.

Eu era capaz de corrigir esse problema alterando os nomes dos madeireiros como assim, em ambos os arquivos:

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

Eu não tenho certeza do erro exata, mas o módulo v2.5 logger parece ter nomes correspondentes problemas passados ??para getLogger() com nomes no arquivo de configuração.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top