Python日志在2.5和2.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 个回答
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中,由于它是一个在配置中明确提到的日志记录器的子日志记录器,所以不会被禁用。