当前位置: 首页 > 知识库问答 >
问题:

Jupyter笔记本不会将日志打印到输出单元格

常海
2023-03-14

我目前正在使用Jupyter笔记本,我想强制它将Python日志打印到输出单元格。

我用的是以前用这种方式工作的旧笔记本,可能是旧版本的Jupyter笔记本。

我将日志设置为:

import logging
logging.basicConfig(format='%(levelname)s : %(message)s', level=logging.INFO)
logging.root.level = 20

但当我打电话时:

logging.info("hello world")

它不会在输出单元格中打印任何内容。它只是在我启动Jupyter笔记本的控制台中打印出内容。

我正在使用python 2.7.10并且在我的虚拟环境中安装的包是:

appnope==0.1.0
backports-abc==0.4
backports.ssl-match-hostname==3.5.0.1
certifi==2016.2.28
decorator==4.0.9
functools32==3.2.3.post2
gnureadline==6.3.3
ipykernel==4.3.1
ipython==4.1.2
ipython-genutils==0.1.0
ipywidgets==4.1.1
Jinja2==2.8
jsonschema==2.5.1
jupyter==1.0.0
jupyter-client==4.2.2
jupyter-console==4.1.1
jupyter-core==4.1.0
MarkupSafe==0.23
mistune==0.7.2
nbconvert==4.1.0
nbformat==4.0.1
notebook==4.1.0
path.py==8.1.2
pexpect==4.0.1
pickleshare==0.6
ptyprocess==0.5.1
Pygments==2.1.3
pyzmq==15.2.0
qtconsole==4.2.0
simplegeneric==0.8.1
singledispatch==3.4.0.3
six==1.10.0
terminado==0.6
tornado==4.3
traitlets==4.1.0
wheel==0.24.0

单元格中的日志打印输出是否已更改?是否有某种方法可以强制Jupyter将日志记录写到输出单元格?

共有3个答案

翟聪
2023-03-14

这里建议的变通方法没有一个对我有用,但是下面的方法有用,也许它会帮助别人。

使用python 3.4.3,jupyter客户端==4.1.1,jupyter核心==4.0.6

import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

logger.info("hello")

信息:main:你好

濮阳品
2023-03-14

希望jupyter的人能解决这个问题。不过,我找到了一个暂时可以使用的解决方法。似乎jupyter笔记本的新版本没有在笔记本中显示stderr,而是将stderr发送到终端。但是,他们仍然打印stdout。您可以将根记录器的处理程序设置为stdout:

import logging
import sys

# Get root logger (all other loggers will be derived from this logger's
# properties)
logger = logging.getLogger()
logger.warning("I will output to terminal")  # No output in notebook, goes to terminal

# assuming only a single handler has been setup (seems 
# to be default in notebook), set that handler to go to stdout.
logger.handlers[0].stream = sys.stdout

logger.warning("FOO")  # Prints: WARNING:root:FOO

# Other loggers derive from the root logger, so you can also do:
logger2 = logging.getLogger("logger2")
logger2.warning("BAR")  # Prints: WARNING:logger2:BAR

如果您将其放在笔记本的顶部,此更改也应传播到您导入的模块中初始化的任何记录器,因为通常记录器将继承根记录器的设置。

关志
2023-03-14

早期的答案似乎不再有效。最完整的一个不再有效,因为没有默认的处理程序,所以修改zeroeth不起作用。此外,在笔记本电脑中运行时,混用根记录器似乎有潜在的问题。

要使记录器将其输出放入单元格中,可以执行以下操作:

logger = logging.getLogger("foo")
logger.addHandler(logging.StreamHandler(stream=sys.stdout))

因此,您自己添加处理程序,并指导其输出。

 类似资料:
  • 所以我使用joblib来并行化一些代码,我注意到在jupyter笔记本中使用它时无法打印东西。 我尝试在ipython中使用相同的示例,效果非常好。 下面是一个在jupyter笔记本电脑中写入的最小(非)工作示例 所以我得到的输出为但没有打印任何内容。 我期望看到的(打印顺序在现实中可能是随机的): 您可以在笔记本进程的日志中看到打印。但我希望打印发生在笔记本上,而不是笔记本过程的日志。 我已经打

  • Jupyter笔记本(Python)以漂亮的打印格式返回单元格中最后一个变量的值。 使用打印(df)不会将数据框打印得很好。但这会很好地打印到Jupyter笔记本上: 如何以漂亮的打印格式打印多个变量? 这里只会以漂亮的打印格式打印: 答案如下(摘自:在iPython笔记本中将数据框显示为表)

  • 问题内容: 我正在寻找从python调用shell脚本并使用日志记录将其stdout和stderr写入文件的方法。这是我的代码: 而且我敢肯定,有一种方法可以做到,而无需创建临时文件来存储进程输出。有任何想法吗? 问题答案: 我敢肯定有一种方法可以做到,而无需创建临时文件来存储进程输出 您只需要检查的文档,尤其是有关和的文档: ,并分别指定执行程序的标准输入,标准输出和标准错误文件句柄。有效值为:

  • 我正在使用jupyter笔记本编写代码,但我面临一个问题,每次运行程序时都必须运行所有代码。 有没有办法从我停止跑步的地方开始节省时间?尤其是因为我的代码需要大约4个小时才能运行。

  • 使用命令: /usr/bin/journalctl-o short-f |ncat{some ip}{some port} 将日志输出转发到某个远程日志跟踪应用程序。 问题是,我在打印输出中缺少systemd单元/服务名称,因此很难判断哪个服务生成哪个日志行。 例如,这是一条nginx生产线: 6月25日07:51:09本地主机bash[497]:10.23.132.98---[25/Jun/20

  • 我有一台安装了Hadoop和Spark的机器。下面是我目前的环境。 Python3.6 /root/.ipython/profile_pyspark/startup/00-pyspark-setup.py /root/anaconda3/share/jupyter/kernels/pyspark/kernel.json kernel.json 所以,由于sc无法初始化,如果我想运行以下操作,它失败