Logging module does not print in IPython

HeinzKurt picture HeinzKurt · Jun 17, 2014 · Viewed 7.4k times · Source

The following code does print 'I want this to print' in 'ipython qtconsole', however it does not print in plain 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')

In 'IPython qtconsole' however i get different problems, that i tried to explain here (which did not go so well, no need to read!).

Can you please tell me why?

EDIT: I use Python 2.7

EDIT2: Maybe i really just need to add logging.StreamHandler.

Answer

Bakuriu picture Bakuriu · Jun 17, 2014

It seems like qtconsole adds an handler to the root logger:

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

While using the normal python interpreter or just ipython:

In [1]: import logging

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

In [3]: root.handlers
Out[3]: []

If you want both to behave the same you should either add a StreamHandler to the root logger for normal ipython, or remove the StreamHandler from the qtconsole interpreter.

If you want the former just add:

root = logging.getLogger()
root.addHandler(logging.StreamHandler())

If you want the latter, before adding your own handler, do:

for handler in root.handlers[:]:
    root.removeHandler(handler)

Note that IPython already provides some machinery for logging to a file. See the documentation. If you want to use the code only inside ipython using its magics might be simpler.