我在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。