2009-06-19 47 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()的名字与配置文件中的名字匹配时遇到问题。

相关问题