8

以下代码确实在“ipython qtconsole”中打印“我希望它打印”,但它不会在普通 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

EDIT2:也许我真的只需要添加logging.StreamHandler。

4

3 回答 3

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]: []

如果您希望两者的行为相同,您应该将 a 添加StreamHandler到根记录器 for normal ipython,或者StreamHandler从 qtconsole 解释器中删除 。

如果你想要前者,只需添加:

root = logging.getLogger()
root.addHandler(logging.StreamHandler())

如果您想要后者,添加您自己的处理程序之前,请执行以下操作:

for handler in root.handlers[:]:
    root.removeHandler(handler)

请注意,IPython 已经提供了一些记录到文件的机制。请参阅文档。如果您只想在 ipython 中使用代码,使用它的魔法可能会更简单。

于 2014-06-17T10:50:22.640 回答
3

什么对我有用

在任何其他库/代码之前导入记录器,在单独的单元格中。这实际上是主要要求。如果我在一个单元格中加载日志记录和其他库,无论该单元格中的层次结构是什么,日志记录都不起作用

import logging
reload(logging)
logger = logging.getLogger(__name__)

只有在加载库后我才设置日志记录配置以避免打印 pyspark load debug

logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', 
                    level=logging.INFO, 
                    datefmt='%I:%M:%S')
于 2016-08-23T14:51:42.793 回答
2

如果您使用 Bakuriu 的后一种解决方案,如果 root 具有多个处理程序,则由于删除时迭代问题,它将无法正常工作。

改用:

while len(root.handlers):
    root.removeHandler(root.handlers[0])
于 2015-06-19T16:58:01.750 回答