2009-06-19 11 views
6

Potresti aiutarmi a risolvere il seguente problema di incompatibilità tra Python 2.5 e 2.6?incompatibilità di registrazione Python tra 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() 

uscita di chiamare logger.py sotto Ubuntu 9.04:

$ python2.5 logger.py 
$ 

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

risposta

8

Questo errore è stato risolto tra 2,5 e 2,6. La funzione fileConfig() è pensata per la configurazione one-off e quindi non dovrebbe essere chiamata più di una volta, tuttavia si sceglie di organizzarla. Il comportamento previsto di fileConfig è di disabilitare tutti i logger che non sono esplicitamente menzionati nella configurazione e lasciare abilitati i logger citati ei loro figli; il bug stava causando la disabilitazione dei bambini quando non avrebbero dovuto essere. La configurazione del logger di esempio menziona i logger 'a' e 'b'; dopo aver chiamato getLogger ('a.submod') viene creato un logger secondario. La seconda chiamata fileConfig disabilita questo in Python 2.5 - in Python 2.6 il logger non è disabilitato poiché è figlio di un logger esplicitamente menzionato nella configurazione.

+0

Sembra abbastanza vicino a destra. – Triptych

+0

Molte grazie per la descrizione dettagliata del problema. – Szilveszter

+1

Trittico: questo deve avere ragione_ perché risponde a chi mantiene il modulo di registrazione python;) –

1

non capisco le ragioni di questo comportamento me stesso, ma come ben indicato nel 2.6 funziona in modo diverso. Possiamo supporre che questo è un bug che colpisce 2,5

Come soluzione alternativa suggerisco il seguente:

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

utilizzando questo schema Sono stato in grado di eseguire logger.py su python2.5.4 con lo stesso comportamento di 2.6

+0

Grazie per la soluzione, funziona davvero. – Szilveszter

0

Interessante ... Ho giocato un po 'nella console e sembra che la seconda chiamata a logging.config.fileConfig è mucking cose sopra. Non capisco perché questo è, però ... Ecco una trascrizione che mostra il 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 
>>> 

Appena chiamo logging.config.fileConfig la seconda volta, il mio esempio logger si arresta la registrazione. L'acquisizione di una nuova istanza di registrazione non aiuta poiché si tratta dello stesso oggetto. Se aspetto fino a dopo aver configurato entrambe le volte per recuperare le istanze del logger, allora le cose funzionano - questo è il motivo per cui l'istanza blog funziona.

Il mio suggerimento è di ritardare l'acquisizione delle istanze del logger finché non ci si trova nelle funzioni. Se trasferisci le chiamate a logging.getLogger() in function_one e function_two, allora tutto funziona correttamente.

0

sono stato in grado di risolvere questo problema cambiando i nomi dei taglialegna, come così, in entrambi i file:

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

non sono sicuro del l'errore esatto, ma il modulo v2.5 logger sembra avere problemi con i nomi corrispondenti passati a con i nomi nel file di configurazione.

Problemi correlati