问题
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.
回答1:
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.
回答2:
If you use Bakuriu's latter solution, it won't work properly if root has more than one handler because of removing-while-iterating problems.
Use instead:
while len(root.handlers):
root.removeHandler(root.handlers[0])
回答3:
what worked for me
import logger BEFORE any other library/code, in separate cell. this is actually the main requirement. If I load logging and other libraries in one cell, no matter what hierarchy in that cell is, logging does not work
import logging
reload(logging)
logger = logging.getLogger(__name__)
only after loading libraries I set logging config to avoid printing pyspark load debug
logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s',
level=logging.INFO,
datefmt='%I:%M:%S')
来源:https://stackoverflow.com/questions/24259952/logging-module-does-not-print-in-ipython