【问题标题】:Logging module does not print in IPython日志模块在 IPython 中不打印
【发布时间】:2014-08-07 05:42:43
【问题描述】:

以下代码确实在“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')

在“IPython qtconsole”中,我遇到了不同的问题,我试图解释here(效果不太好,无需阅读!)。

你能告诉我为什么吗?

编辑:我使用 Python 2.7

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

【问题讨论】:

  • 什么版本的python?
  • 您正在设置 file 处理程序,因此输出将发送到文件 log.txt。我不知道你为什么认为控制台应该在标准输出上输出...
  • 这对我有用:我得到像“2014-06-17 11:39:29,422 - - INFO - 我想要这个打印" 在 log.txt 中。
  • @Bakuriu 因为我设置了 log.setLevel(logging.INFO)。我在想,这配置了控制台打印行为。在 qtconsole 中它也会打印。
  • @Evert 您使用的是哪个控制台?

标签: python logging ipython qtconsole


【解决方案1】:

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

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

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

In [1]: import logging

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

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

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

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

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

如果你想要后者,添加你自己的处理程序之前,这样做:

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

请注意,IPython 已经提供了一些记录到文件的机制。见the documentation。如果你只想在 ipython 中使用代码,使用它的魔法可能会更简单。

【讨论】:

  • 如果你使用后一种解决方案,如果 root 有多个处理程序,它将无法正常工作,因为删除时迭代问题。改用:``` while len(root.handlers): root.removeHandler(root.handlers[0]) ```
  • @RonanPaixão 仔细阅读代码。我相信您遗漏了 3 个能够产生影响并阻止您描述的行为的字符。
【解决方案2】:

什么对我有用

在任何其他库/代码之前导入记录器,在单独的单元格中。这实际上是主要要求。如果我在一个单元格中加载日志记录和其他库,则无论该单元格中的层次结构是什么,日志记录都不起作用

import logging
reload(logging)
logger = logging.getLogger(__name__)

只有在加载库后我才设置日志配置以避免打印 pyspark load debug

logging.basicConfig(format='%(asctime)s %(levelname)s:%(message)s', 
                    level=logging.INFO, 
                    datefmt='%I:%M:%S')

【讨论】:

  • 我在 Python 2.7 conda 环境中运行 Spyder3,这为我解决了这个问题。谢谢!
  • python 3 上的注意事项:您需要from importlib import reload,因为它不再是内置的。
【解决方案3】:

如果您使用 Bakuriu 的后一种解决方案,如果 root 有多个处理程序,它将无法正常工作,因为迭代时删除问题。

改用:

while len(root.handlers):
    root.removeHandler(root.handlers[0])

【讨论】:

  • Bakuriu 的回答不存在您描述的问题,这要归功于[:] 的使用(他在回复您的评论时提到的3 个字符)。但是,您的解决方案也有效。
猜你喜欢
  • 2017-02-23
  • 2015-07-08
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 2011-06-03
  • 2020-03-27
  • 1970-01-01
  • 2013-08-15
相关资源
最近更新 更多