Python Jupyter笔记本不会将日志打印到输出单元格
我目前正在使用Python Jupyter笔记本不会将日志打印到输出单元格,python,ipython,jupyter,jupyter-notebook,Python,Ipython,Jupyter,Jupyter Notebook,我目前正在使用Jupyter笔记本,我想强制它将Python日志打印到输出单元格 我用的是以前用这种方式工作的旧笔记本,可能是旧版本的Jupyternotebook 我已将日志设置为: import logging logging.basicConfig(format='%(levelname)s : %(message)s', level=logging.INFO) logging.root.level = 20 但当我打电话时: logging.info("hello world") 它
Jupyter
笔记本,我想强制它将Python
日志打印到输出单元格
我用的是以前用这种方式工作的旧笔记本,可能是旧版本的Jupyter
notebook
我已将日志设置为:
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将日志写入输出单元格 我找到了一个我以前的
python2.7.10
virtualenv,其中jupyter
可以按需要工作
appnope==0.1.0
backports.ssl-match-hostname==3.4.0.2
boto==2.38.0
bz2file==0.98
certifi==2015.9.6.2
decorator==4.0.4
functools32==3.2.3.post2
gensim==0.12.2
gnureadline==6.3.3
httpretty==0.8.6
ipykernel==4.1.1
ipython==4.0.0
ipython-genutils==0.1.0
ipywidgets==4.1.1
Jinja2==2.8
jsonschema==2.5.1
jupyter==1.0.0
jupyter-client==4.1.1
jupyter-console==4.0.3
jupyter-core==4.0.6
MarkupSafe==0.23
mistune==0.7.1
nbconvert==4.1.0
nbformat==4.0.1
notebook==4.0.6
numpy==1.10.1
path.py==8.1.2
Pattern==2.6
pexpect==4.0.1
pickleshare==0.5
ptyprocess==0.5
Pygments==2.0.2
pyzmq==14.7.0
qtconsole==4.1.0
requests==2.8.1
scipy==0.16.0
simplegeneric==0.8.1
six==1.10.0
smart-open==1.3.0
terminado==0.5
tornado==4.2.1
traitlets==4.0.0
wheel==0.24.0
有些软件包与jupyter问题无关,问题可能出现在一些相关软件包的版本中。我会进一步调查到底在哪里
编辑:
最后,我发现问题出在包中:ipykernel==4.3.1
或者因为ipykernel==4.3.0
使用ipykernel==4.1.1
或ipykernel==4.2.2
一切正常
github向jupyter和ipykernel报告了这个问题:希望jupyter的人能够解决这个问题。不过,我找到了一个暂时可以使用的解决方法。似乎jupyter笔记本的新版本没有在笔记本中显示stderr,而是将stderr发送到终端。但是,他们仍然打印标准件。您可以将根记录器的处理程序设置为标准输出:
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
如果您将其放在笔记本的顶部,此更改也会传播到在您导入的模块中初始化的任何记录器,因为通常记录器将继承根记录器的设置。此处建议的解决方法对我来说都不管用,但下面的方法确实管用,可能会帮助其他人 使用Python3.4.3,jupyter客户端==4.1.1,jupyter核心==4.0.6
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
logger.info("hello")
信息:main:您好
先前的答案似乎不再有效。最完整的一个不再有效,因为没有默认的处理程序,所以修改zeroeth不起作用。此外,在笔记本电脑中运行时,搞乱根日志记录器似乎可能会让人感到不安 要使
“foo”
记录器将其输出放入单元格中,可以执行以下操作:
logger = logging.getLogger("foo")
logger.addHandler(logging.StreamHandler(stream=sys.stdout))
因此,您自己添加处理程序,并引导其输出。指定流的解决方案运行良好。如果使用dictConfig,另一个配置选项是将流添加为参数
import logging
import logging.config
logging.config.dictConfig({
"version": 1,
"disable_existing_loggers": True,
"formatters": {
"default": {
"format": "{levelname} {asctime} | {message}",
"style": "{",
},
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"formatter": "default",
"stream": sys.stdout,
}
},
"root": {
"level": "DEBUG",
"handlers": ["console"],
},
})
对我有用。我在笔记本上看到一个红色的盒子,上面写着信息。使用4.0.1版。@MikeMüller版本4.0.1。哪个包裹?ipython?是的,Python和Python3.5上的jupyter 1.0.0。检查
sys.stderr
是什么。应该是
sys.stderr在我的例子中是
,这似乎是正确的。上述内容对我不起作用(python 3.6.8)。我的记录器没有附加任何处理程序,所以尝试设置zeroeth流只会导致数组引用错误。现在它不会保存到文件中