日志模块在IPython中不打印
下面的代码在 'ipython qtconsole' 中确实会打印出 'I want this to print',但是在普通的 IPython 中却不会打印出来。
import logging
import logging.handlers
log = logging.getLogger()
f = logging.Formatter("%(asctime)s - %(module)s. %(funcName)s - %(levelname)s - %(message)s")
fh = logging.handlers.TimedRotatingFileHandler('log.txt', 'W6')
fh.setFormatter(f)
log.addHandler(fh)
log.setLevel(logging.INFO)
log.info('I want this to print')
在 'IPython qtconsole' 中,我遇到了不同的问题,我试着在 这里 解释过(不过解释得不太好,不用去看!)。
你能告诉我这是为什么吗?
补充:我使用的是 Python 2.7
补充2:也许我真的只需要添加 logging.StreamHandler。
3 个回答
2
如果你使用Bakuriu后面提到的解决方案,当根节点有多个处理器时,它可能会出现问题,因为在遍历的时候删除元素会导致一些麻烦。
建议使用以下方法:
while len(root.handlers):
root.removeHandler(root.handlers[0])
3
对我有效的方法
在导入任何其他库或代码之前,先导入日志记录库,并且要在单独的代码块中。这其实是最主要的要求。如果我在一个代码块中同时加载日志记录和其他库,不管里面的顺序如何,日志记录都不会正常工作。
import logging
reload(logging)
logger = logging.getLogger(__name__)
只有在加载完库之后,我才设置日志记录的配置,以避免打印出pyspark加载时的调试信息。
logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s',
level=logging.INFO,
datefmt='%I:%M:%S')
23
看起来 qtconsole
会给 root
日志记录器添加一个处理器:
In [1]: import logging
...: root = logging.getLogger()
...: root.handlers
...:
Out[1]: [<logging.StreamHandler at 0x7fd8e00e1f98>]
当你使用普通的 Python 解释器或者只是 ipython
时:
In [1]: import logging
In [2]: root = logging.getLogger()
In [3]: root.handlers
Out[3]: []
如果你希望这两者的表现一致,你可以选择给普通的 ipython
添加一个 StreamHandler
,或者从 qtconsole 解释器中移除 StreamHandler
。
如果你想添加处理器,就直接加上:
root = logging.getLogger()
root.addHandler(logging.StreamHandler())
如果你想移除处理器,在添加你自己的处理器之前,先执行:
for handler in root.handlers[:]:
root.removeHandler(handler)
请注意,IPython 已经提供了一些工具来记录日志到文件。你可以查看 文档。如果你只想在 ipython 内部使用代码,使用它的魔法命令可能会更简单。