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

6 投票
4 回答
1343 浏览
提问于 2025-04-15 12:22

你能帮我解决一下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 个回答

0

我通过在两个文件中更改日志记录器的名称来解决了这个问题,具体如下:

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

我不太确定具体的错误是什么,但v2.5版本的日志记录模块似乎在把传给getLogger()的名称和配置文件中的名称进行匹配时遇到了麻烦。

1

我自己也不太明白这个行为的原因,但正如你在2.6中所说的,它的工作方式确实不同。我们可以认为这是影响2.5的一个bug。

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

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是一样的。

8

这是一个在2.5和2.6版本之间修复的错误。fileConfig()这个函数是用来进行一次性配置的,所以不应该被调用多次,不管你怎么安排。fileConfig的预期行为是禁用那些在配置中没有明确提到的日志记录器,而保留那些被提到的日志记录器及其子日志记录器;这个错误导致一些子日志记录器被错误地禁用了。举个例子,日志配置中提到了日志记录器'a'和'b';当你调用getLogger('a.submod')时,会创建一个子日志记录器。在Python 2.5中,第二次调用fileConfig会错误地禁用这个子日志记录器,而在Python 2.6中,由于它是一个在配置中明确提到的日志记录器的子日志记录器,所以不会被禁用。

撰写回答