IPython日志记录将转到终端,直到第二次通过

时间:2015-01-15 19:24:48

标签: python logging ipython

我在IPython工作,我注意到在第二次运行代码之前,日志记录并不正确。按照建议here运行imp.reload(logging)并不能解决问题。

以下是代码:

import logging, imp

def print_handlers(text, logger):
    print("{}; handlers are {}".format(text, [h.stream for h in logger.handlers]))

logger = logging.getLogger()
print_handlers("Before config", logger)
logger.error("Before config")

logging.basicConfig()
logger = logging.getLogger()
print_handlers("After basicConfig", logger)
logger.error("After basicConfig")

imp.reload(logging)
logging.basicConfig()
logger = logging.getLogger()
print_handlers("After reload and basicConfig", logger)
logger.error("After reload and basicConfig")

我第一次在启动一个新的IPython会话后运行它,以下输出转到我运行IPython的终端中的stderr:

ERROR:root:Before config
ERROR:root:After basicConfig
ERROR:root:After reload and basicConfig

我在IPython窗口中得到了这个输出:

Before config; handlers are [<_io.TextIOWrapper name='<stderr>' mode='w' encoding='ANSI_X3.4-1968'>]
After basicConfig; handlers are [<_io.TextIOWrapper name='<stderr>' mode='w' encoding='ANSI_X3.4-1968'>]
After reload and basicConfig; handlers are [<_io.TextIOWrapper name='<stderr>' mode='w' encoding='ANSI_X3.4-1968'>]

请注意,整个日志记录的输出都被定向到stderr。

现在,如果我再次使用其中的代码评估单元格,我会获得相同的日志记录,但这次它们到达我的IPython窗口(我想要它们),而不是在我运行IPython的终端中。 print命令给了我这个:

Before config; handlers are []
After basicConfig; handlers are [<IPython.kernel.zmq.iostream.OutStream object at 0x7ffc1b308048>]
After reload and basicConfig; handlers are [<IPython.kernel.zmq.iostream.OutStream object at 0x7ffc1b308048>]

我可以从一开始就将日志记录显示在IPython中,而不是必须运行我的代码两次吗?

我使用的是Python 3.4.2和IPython 2.3.0。

0 个答案:

没有答案