【问题标题】:Python logging incompatibilty between 2.5 and 2.6Python 日志记录在 2.5 和 2.6 之间不兼容
【发布时间】:2010-11-04 08:21:36
【问题描述】:

您能帮我解决以下 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.
$

【问题讨论】:

    标签: python logging incompatibility


    【解决方案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 相同

    【讨论】:

      【解决方案2】:

      有趣...我在控制台中玩了一点,看起来对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,则一切正常。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 三联画:这必须是正确的,因为它是由维护python日志模块的人回答的;)
        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-26
          • 2016-01-15
          • 1970-01-01
          • 2012-01-12
          • 1970-01-01
          • 1970-01-01
          • 2017-03-02
          • 2013-06-12
          相关资源
          最近更新 更多