记录模块不在IPython中打印

Hei*_*urt 7 python logging ipython qtconsole

下面的代码在'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')
Run Code Online (Sandbox Code Playgroud)

在'IPython qtconsole'然而我得到了不同的问题,我试图在这里解释(这不是很好,不需要阅读!).

你能告诉我为什么吗?

编辑:我使用Python 2.7

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

Bak*_*riu 22

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

In [1]: import logging
   ...: root = logging.getLogger()
   ...: root.handlers
   ...: 
Out[1]: [<logging.StreamHandler at 0x7fd8e00e1f98>]
Run Code Online (Sandbox Code Playgroud)

使用普通的python解释器或只是ipython:

In [1]: import logging

In [2]: root = logging.getLogger()

In [3]: root.handlers
Out[3]: []
Run Code Online (Sandbox Code Playgroud)

如果您希望两者的行为相同,则应将StreamHandler根记录器添加到正常ipython,或StreamHandler从qtconsole解释器中删除.

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

root = logging.getLogger()
root.addHandler(logging.StreamHandler())
Run Code Online (Sandbox Code Playgroud)

如果你想要后者,添加自己的处理程序之前,请执行:

for handler in root.handlers[:]:
    root.removeHandler(handler)
Run Code Online (Sandbox Code Playgroud)

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

  • @RonanPaixão仔细阅读代码.我相信你错过了3个有所作为的角色并且阻止了你所描述的行为. (4认同)