2009-06-19 17 views
6

¿Podría ayudarme a resolver el siguiente problema de incompatibilidad entre Python 2.5 y 2.6?Incompatibilidad de registro de Python entre 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 logger.py bajo Ubuntu 9.04:

$ python2.5 logger.py 
$ 

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

Respuesta

8

Este es un error que se solucionó entre 2.5 y 2.6. La función fileConfig() está pensada para una configuración única y, por lo tanto, no debe invocarse más de una vez, independientemente de cómo elija organizarla. El comportamiento previsto de fileConfig es desactivar cualquier registrador que no se mencione explícitamente en la configuración, y dejar habilitados los registradores mencionados y sus hijos; el error estaba causando que los niños estuvieran desactivados cuando no deberían haber estado. La configuración del registrador de ejemplo menciona los registradores 'a' y 'b'; después de llamar a getLogger ('a.submod') se crea un registrador hijo. La segunda llamada fileConfig deshabilita esto en Python 2.5. En Python 2.6, el registrador no está deshabilitado ya que es un elemento secundario de un registrador mencionado explícitamente en la configuración.

+0

Esto suena bastante cerca de la derecha. – Triptych

+0

Muchas gracias por la descripción detallada del problema. – Szilveszter

+1

Tríptico: Este _ tiene que ser correcto_ porque lo responde alguien que mantiene el módulo de registro de Python;) –

1

no entiendo las razones de este comportamiento mí mismo, pero como bien declaró en 2.6 que funciona de manera diferente. Podemos suponer que esto es un error que afecta a 2,5

Como solución 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.") 

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

+0

Gracias por la solución, realmente funciona. – Szilveszter

0

Interesante ... Jugué un poco en la consola y parece que la segunda llamada a logging.config.fileConfig es mucking cosas claras. No estoy seguro de por qué esto es, sin embargo ... He aquí 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 me llamo logging.config.fileConfig la segunda vez, mi ejemplo registrador se detiene la tala. Tomar una nueva instancia de registro no ayuda ya que es el mismo objeto. Si espero hasta después de configurar ambas veces para buscar las instancias del registrador, entonces las cosas funcionan: esta es la razón por la cual la instancia blog funciona.

Mi sugerencia es retrasar el agarrar las instancias del registrador hasta que esté en las funciones. Si mueve las llamadas al logging.getLogger() en function_one y function_two, todo funciona bien.

0

que era capaz de solucionar este problema mediante el cambio de los nombres de los registradores como así, 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 v2.5 registrador parece tiene problemas para emparejar nombres pasados ​​a getLogger() con nombres en el archivo de configuración.

Cuestiones relacionadas