6

您能帮我解决以下 Python 2.5 和 2.6 之间的不兼容问题吗?

记录器配置文件:

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

记录器.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.
$
4

4 回答 4

8

这是在 2.5 和 2.6 之间修复的错误。fileConfig() 函数用于一次性配置,因此不应多次调用 - 但是您可以选择安排它。fileConfig 的预期行为是禁用配置中未明确提及的任何记录器,并保持启用提及的记录器及其子级;该错误导致孩子们在不应该被禁用时被禁用。示例记录器配置提到记录器“a”和“b”;调用 getLogger('a.submod') 后,将创建一个子记录器。第二个 fileConfig 调用在 Python 2.5 中错误地禁用了此功能 - 在 Python 2.6 中,记录器没有被禁用,因为它是配置中明确提到的记录器的子级。

于 2009-06-19T17:03:53.343 回答
1

我自己不明白这种行为的原因,但正如你在 2.6 中所说的那样,它的工作方式不同。我们可以假设这是一个影响 2.5 的错误

作为一种解决方法,我建议如下:

额外模块.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.")

通过使用这个方案,我能够在 python2.5.4 上运行 logger.py,其行为与 2.6 相同

于 2009-06-19T15:46:30.813 回答
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()and function_onefunction_two则一切正常。

于 2009-06-19T15:47:03.447 回答
0

我可以通过在两个文件中更改记录器的名称来解决此问题:

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

我不确定确切的错误,但 v2.5 记录器模块似乎无法将传递给getLogger()的名称与配置文件中的名称匹配。

于 2009-06-19T17:23:15.097 回答