下面的代码确实在'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
也许我真的只需要添加logging.StreamHandler。似乎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已经提供了一些记录文件的机制。请参阅文档。如果您只想在python内部使用代码,使用它的魔力可能会更简单。
什么对我有用
在任何其他库/代码之前导入logger,在单独的单元格中。这实际上是主要的要求。如果我在一个单元格中加载日志和其他库,无论该单元格中的层次是什么,日志都不起作用
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')
如果您使用Bakuriu的后一种解决方案,如果根有多个处理程序,由于迭代时删除的问题,它将无法正常工作。
使用:
while len(root.handlers):
root.removeHandler(root.handlers[0])