Python日志在2.5和2.6之间存在不兼容性。

6

你可以帮我解决Python 2.5和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()

在Ubuntu 9.04下调用logger.py的输出:
$ python2.5 logger.py
$

$ python2.6 logger.py
function_one() called.
function_two() called.
$
4个回答

8
这是一个在2.5和2.6之间修复的错误。fileConfig()函数旨在进行一次性配置,因此不应该被多次调用 - 无论您选择如何安排。fileConfig的预期行为是禁用未在配置中明确提到的任何记录器,并保留提到的记录器及其子记录器; 这个错误导致子记录器在不应该被禁用时被禁用。示例记录器配置提到了记录器'a'和'b'; 调用getLogger('a.submod')后创建了一个子记录器。在Python 2.5中,第二个fileConfig调用错误地禁用了这个记录器 - 在Python 2.6中,由于它是在配置中明确提到的记录器的子记录器,因此该记录器不会被禁用。

1
三联画:这一定要正确,因为它是由维护Python日志模块的人回答的 ;) - lprsd

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

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


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()的名称与配置文件中的名称匹配时存在问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接