2009-06-19 73 views
6

您可以幫我解決Python 2.5和2.6之間的以下不兼容問題嗎?2.5和2.6之間的Python日誌記錄不兼容性

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

輸出Ubuntu 9.04的下調用logger.py的:

$ python2.5 logger.py 
$ 

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

回答

8

這是一個固定在2.5和2.6之間的錯誤。 fileConfig()函數用於一次性配置,因此不應該多次調用 - 但是您可以選擇安排這一點。 fileConfig的預期行爲是禁用配置中未明確提及的任何記錄器,並保留啓用所述記錄器及其子項;這個錯誤導致了孩子們不應該去的時候被禁用。示例記錄器配置提到記錄器'a'和'b';調用getLogger('a.submod')後,會創建一個子記錄器。第二個fileConfig調用在Python 2.5中錯誤地禁用了這個 - 在Python 2.6中,記錄器未被禁用,因爲它是配置中明確提到的記錄器的子節點。

+0

這聽起來非常接近於正確。 – Triptych 2009-06-19 17:20:25

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

+0

謝謝你的解決方法,它確實有效。 – Szilveszter 2009-06-20 12:56:55

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_onefunction_two,那麼一切正常。

0

我能夠通過改變像這樣的記錄程序的名稱來解決這個問題,在這兩個文件:

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

我不知道確切的錯誤,但V2.5記錄器模塊似乎在傳遞給getLogger()的名字與配置文件中的名字匹配時遇到問題。

相關問題