Pregunta

¿Podría ayudarme a resolver el siguiente problema de incompatibilidad entre Python 2.5 y 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()

Salida de llamar a logger.py en Ubuntu 9.04:

$ python2.5 logger.py
$

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

Solución

Este es un error que se corrigió entre 2.5 y 2.6. La función fileConfig () está diseñada para una configuración única y, por lo tanto, no debe llamarse más de una vez; sin embargo, elige organizar esto. El comportamiento previsto de fileConfig es deshabilitar los registradores que no se mencionan explícitamente en la configuración, y dejar habilitados los registradores mencionados y sus hijos; el error causaba que los niños se desactivaran cuando no deberían haberlo sido. El ejemplo de configuración del registrador menciona los registradores 'a' y 'b'; después de llamar a getLogger ('a.submod') se crea un registrador secundario. La segunda llamada a fileConfig deshabilita esto incorrectamente en Python 2.5: en Python 2.6, el registrador no está deshabilitado ya que es hijo de un registrador mencionado explícitamente en la configuración.

Otros consejos

No entiendo las razones de este comportamiento, pero como bien dijo en 2.6, funciona de manera diferente. Podemos suponer que se trata de un error que afecta a 2.5

Como solución alternativa, sugiero lo siguiente:

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

al usar este esquema pude ejecutar logger.py en python2.5.4 con el mismo comportamiento que el 2.6

Interesante ... Jugué un poco en la consola y parece que la segunda llamada a logging.config.fileConfig está arruinando las cosas. Sin embargo, no estoy seguro de por qué ... Esto es una transcripción que muestra el 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
>>>

Tan pronto como llamo a logging.config.fileConfig la segunda vez, mi instancia de registrador detiene el registro. Agarrar una nueva instancia de registro no ayuda, ya que es el mismo objeto. Si espero hasta después de configurar ambas veces para recuperar las instancias del registrador, entonces las cosas funcionan, es por eso que la instancia de blog funciona.

Mi sugerencia es retrasar la captura de las instancias del registrador hasta que esté en las funciones. Si mueve las llamadas a logging.getLogger () a function_one y function_two , entonces todo funciona bien.

Pude solucionar esto cambiando los nombres de los registradores de esta manera, en ambos archivos:

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

No estoy seguro del error exacto, pero el módulo de registro v2.5 parece tener problemas para hacer coincidir los nombres pasados ??a getLogger () con los nombres en el archivo de configuración.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top