如何获取Azure App Service中Jupyter Notebook内核连接日志
我是Jupyter Notebook初学者,经初步判断当前问题属于Web应用部署范畴。
- 核心问题:如何查看Jupyter Notebook的内核连接相关日志?
- 核心故障:部署的Jupyter Notebook出现内核连接异常,需要获取对应日志定位故障根因;当前使用tornado 4.5.3版本,已排除tornado组件相关问题。
我接手了同事遗留的老旧Jupyter Notebook项目,项目内的ML模型基于Python 2.7编写,原开发人员均已离职,无法完成Python 3版本适配。此前项目在Windows 7设备上运行正常,设备升级到Windows 10后系统Python版本从2升级为3,导致Jupyter Notebook无法运行。我在自己的Windows 10笔记本上配置Python 2.7环境成功调通该数据模型应用后,将应用容器化并部署到Azure平台,本地Docker容器运行验证正常,但在Azure站点上运行Notebook时出现内核连接失败问题,因此需要获取相关日志排查连接失败原因。
故障现象参考:
Dockerfile配置
FROM python:2.7.18 LABEL name="model" COPY ./requirements.txt /app/requirements.txt WORKDIR /app RUN apt-get update \ && pip install --upgrade pip \ && pip install -r requirements.txt \ && rm -rf /var/cache/apk/* COPY "/" /app CMD ["python", "-m", "notebook", "--port=80", "--ip=0.0.0.0", "--allow-root", "--no-browser", "--NotebookApp.token=''"]
依赖清单(requirements.txt)
attrs==21.4.0 backports-abc==0.5 backports.functools-lru-cache==1.6.4 backports.shutil-get-terminal-size==1.0.0 bleach==3.3.1 certifi==2021.10.8 colorama==0.4.5 configparser==4.0.2 contextlib2==0.6.0.post1 cycler==0.10.0 decorator==4.4.2 defusedxml==0.7.1 entrypoints==0.3 enum34==1.1.10 functools32==3.2.3.post2 futures==3.3.0 importlib-metadata==2.1.3 ipykernel==4.10.1 ipython==5.10.0 ipython-genutils==0.2.0 Jinja2==2.11.3 jsonschema==3.2.0 jupyter-client==5.3.5 jupyter-core==4.6.3 kiwisolver==1.1.0 MarkupSafe==1.1.1 matplotlib==2.2.5 mistune==0.8.4 nbconvert==5.6.1 nbformat==4.4.0 notebook==5.2.0 numpy==1.16.6 packaging==20.9 pandas==0.24.2 pandocfilters==1.5.0 pathlib2==2.3.7.post1 pickleshare==0.7.5 prompt-toolkit==1.0.18 Pygments==2.5.2 pyparsing==2.4.7 pyrsistent==0.16.1 python-dateutil==2.8.2 pytz==2022.1 pyzmq==19.0.2 scandir==1.10.0 scikit-learn==0.20.4 scipy==1.2.3 seaborn==0.9.1 simplegeneric==0.8.1 singledispatch==3.7.0 six==1.16.0 testpath==0.4.4 tornado==4.5.3 traitlets==4.3.3 treeinterpreter==0.2.3 typing==3.10.0.0 wcwidth==0.2.5 webencodings==0.5.1 win-unicode-console==0.5 zipp==1.2.0
日志获取方式
1. 开启Jupyter全局调试日志
修改容器启动命令,增加--debug参数并将标准输出、错误输出重定向到日志文件,方便在Azure侧拉取:
python -m notebook --port=80 --ip=0.0.0.0 --allow-root --no-browser --NotebookApp.token='' --debug > /app/jupyter_run.log 2>&1
所有内核启动流程、WebSocket连接请求、通信报错信息都会写入/app/jupyter_run.log,可通过Azure门户的容器日志功能或SSH进入容器直接查看该文件。
2. 查看单内核独立日志
Jupyter每个启动的内核都会生成独立日志,先执行命令查询运行时目录:
jupyter --runtime-dir
进入对应目录后,kernel-<内核ID>.log文件就是对应内核的独立运行日志,会记录内核启动失败、依赖缺失、ZeroMQ通信异常、权限不足等具体根因,同目录下的kernel-<内核ID>.json是内核连接配置文件。
3. Azure平台侧直接拉取日志
- 若使用Azure App Service部署容器,直接在门户开启「应用服务日志」,平台会自动捕获容器所有stdout/stderr输出的Jupyter运行日志
- 若使用Azure Container Instances部署,执行
az container logs --name <容器实例名> --resource-group <资源组名>即可直接拉取容器运行日志
高概率故障排查点
结合本地运行正常、Azure侧连接失败的场景,优先排查以下问题:
- WebSocket拦截问题:Jupyter前端和内核通过WebSocket长连接通信,若Azure前置网关、反向代理未开启WebSocket支持,拦截了Connection: Upgrade请求,会直接导致内核连接失败,这类问题会在日志中出现WebSocket连接返回400/404/503的报错
- 权限问题:检查容器内Jupyter运行时目录、
/app目录的读写权限,避免内核启动时无法生成连接配置文件 - 端口映射问题:确认Azure侧80端口的TCP流量、WebSocket升级请求都正常转发到容器实例,没有做端口限制或协议拦截
内容的提问来源于stack exchange,提问作者PythonKiddieScripterX

