日志模块在python中不打印



下面的代码确实在'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。

似乎qtconsoleroot记录器添加了一个处理程序:

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])

最新更新