1

导入需要使用的模块后,我看到了额外的日志记录消息。我正在努力找出阻止这种情况发生的正确方法。以下代码最能说明问题:

import os
import logging
import flickrapi

class someObject:
    def __init__(self):
        self.value = 1
        logger = logging.getLogger(__name__)
        print logger.handlers
        logger.info("value = " + str(self.value))

def main():
    # Set up logging
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('[%(asctime)-15s] %(name)-8s %(levelname)-6s %message)s')
    fh = logging.FileHandler(os.path.splitext(os.path.basename(__file__))[0]+".log")
    fh.setLevel(logging.DEBUG)
    fh.setFormatter(formatter)
    logger.addHandler(fh)
    ch = logging.StreamHandler()
    ch.setLevel(logging.INFO)
    ch.setFormatter(formatter)
    logger.addHandler(ch)
    logger.debug("Debug message")
    logger.info("Info message")

    thingy = someObject()

if __name__ == "__main__":
    main()

通过 flickrapi 导入,我看到以下输出:

DEBUG:__main__:Debug message
[2013-05-03 12:10:47,755] __main__ INFO   Info message
INFO:__main__:Info message
[<logging.FileHandler instance at 0x1676dd0>, <logging.StreamHandler instance at 0x1676ea8>]
[2013-05-03 12:10:47,755] __main__ INFO   value = 1
INFO:__main__:value = 1

删除 flickrapi 导入后,我看到了正确的输出:

[2013-05-03 12:10:47,755] __main__ INFO   Info message
[<logging.FileHandler instance at 0x1676dd0>, <logging.StreamHandler instance at 0x1676ea8>]
[2013-05-03 12:10:47,755] __main__ INFO   value = 1

这是我第一次使用日志记录,这让我有点难过。我已经阅读了几次文档,但我认为我的理解中遗漏了一些东西。

看着logging.Logger.manager.loggerDict,还有其他记录器,但每个记录器.handlers都是空的。__main__记录器只有我添加的两个处理程序,那么这些消息来自哪里?

当我碰壁时,任何关于我如何解决这个问题的指示都将不胜感激。

谢谢

4

1 回答 1

3

这是您正在使用的 flickrapi 库中的一个错误。它在其中调用logging.basicConfig()对于库来说__init__.py这是错误的事情,因为它将默认为 stderr 的 StreamHandler 添加到根记录器。

您可能应该与作者一起打开错误报告。在 python 日志记录文档中有一个关于库应该如何配置日志记录的 HOWTO

要在修复错误之前解决此问题,您应该能够执行以下操作:

# at the top of your module before doing anything else
import flickrapi
import logging
try:
    logging.root.handlers.pop()
except IndexError:
    # once the bug is fixed in the library the handlers list will be empty - so we need to catch this error
    pass
于 2013-05-03T12:40:38.037 回答