Python Flask 奇怪的日志记录行为 (kubernetes)
Python Flask weird logging behavior (kubernetes)
所以我制作了一个非常简单的基于 flask 的应用程序并将其托管在 kubernetes pod 中。
当我在 Rancher 中打开日志时,我可以看到这个警告:
* Serving Flask app "app/preapproved_limits/api.py"
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
当我在本地机器上启动 flask 时,我也看到了。
但是我在我的本地机器上看不到而在 Rancher 中确实看到的是:
10.0.67.20 - - [02/Jul/2020 16:49:20] "GET /health HTTP/1.1" 200 -
INFO:werkzeug:10.0.67.20 - - [02/Jul/2020 16:49:20] "GET /health HTTP/1.1" 200 -
每 5 秒记录一次。
什么鬼?
但最重要和最烦人的是我看不到我用 Python 的 print()
功能制作的日志。
谁能解释一下:
- 为什么我在 Rancher 和本地都看到了一些东西(最初的 Flask 警告),但是
- 为什么我只能在 Rancher 中看到某些内容(
/health
或 INFO:werkzeug
日志)
- 为什么我只能在本地机器上看到某些东西,而在 Rancher 中却看不到 (
print()
)
/health
是k8s需要的正常健康检查端点。
默认情况下,Flask 不会打印到标准输出,因为它会缓冲行以使 I/O 更有效率。您可以调用 sys.stdout.flush()
、print(flush=True)
,在您的 Dockerfile 中设置环境变量 PYTHONUNBUFFERED=1
(可能是最简单的),或者像我们一样使用 logging
模块。
您可以阅读有关此环境变量的更多信息 here。
所以我制作了一个非常简单的基于 flask 的应用程序并将其托管在 kubernetes pod 中。
当我在 Rancher 中打开日志时,我可以看到这个警告:
* Serving Flask app "app/preapproved_limits/api.py"
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
当我在本地机器上启动 flask 时,我也看到了。
但是我在我的本地机器上看不到而在 Rancher 中确实看到的是:
10.0.67.20 - - [02/Jul/2020 16:49:20] "GET /health HTTP/1.1" 200 -
INFO:werkzeug:10.0.67.20 - - [02/Jul/2020 16:49:20] "GET /health HTTP/1.1" 200 -
每 5 秒记录一次。 什么鬼?
但最重要和最烦人的是我看不到我用 Python 的 print()
功能制作的日志。
谁能解释一下:
- 为什么我在 Rancher 和本地都看到了一些东西(最初的 Flask 警告),但是
- 为什么我只能在 Rancher 中看到某些内容(
/health
或INFO:werkzeug
日志) - 为什么我只能在本地机器上看到某些东西,而在 Rancher 中却看不到 (
print()
)
/health
是k8s需要的正常健康检查端点。
默认情况下,Flask 不会打印到标准输出,因为它会缓冲行以使 I/O 更有效率。您可以调用 sys.stdout.flush()
、print(flush=True)
,在您的 Dockerfile 中设置环境变量 PYTHONUNBUFFERED=1
(可能是最简单的),或者像我们一样使用 logging
模块。
您可以阅读有关此环境变量的更多信息 here。