导入我需要使用的模块后,我看到了额外的日志消息。我正在努力找出阻止这种情况发生的正确方法。以下代码最佳地显示了问题:
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__
记录器只有我添加的两个处理程序,这些消息来自哪里?
关于如何解决这个问题的任何指示都会非常感激,因为我已经碰壁了。
由于
答案 0 :(得分:3)
这是您正在使用的flickrapi库中的错误。它在logging.basicConfig()中调用it's __init__.py
这对于库来说是错误的,因为它将一个StreamHandler默认添加到stderr到根记录器。
您应该与作者一起打开错误报告。 There is a HOWTO in the python logging docs on how libraries should configure logging
要解决此问题,直到修复错误,您应该能够执行以下操作:
# 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