有没有办法在 gunicorn 中记录 python 打印语句?
Posted
技术标签:
【中文标题】有没有办法在 gunicorn 中记录 python 打印语句?【英文标题】:Is there a way to log python print statements in gunicorn? 【发布时间】:2015-02-25 13:55:30 【问题描述】:像这样使用我的 Procfile:
web: gunicorn app:app \
--bind "$HOST:$PORT" \
--debug --error-logfile "-" \
--enable-stdio-inheritance \
--reload \
--log-level "debug"
是否有可能以任何方式将 python print
语句记录到标准输出/bash?我在这里也使用bottle
框架,如果这会影响任何事情的话。
【问题讨论】:
调试标志不适用于 gunicorn。如果您尝试运行它,它实际上会失败:gunicorn: error: unrecognized arguments: --debug
【参考方案1】:
这对我有用(我正在使用名为 si-ct
的服务)
gunicorn --workers 3 --bind unix:si-ct.sock -m 007 wsgi:app --log-level debug --error-logfile - --access-logfile - --capture-output --reload
这样,print
输出显示在我的服务日志中,我使用它来阅读
sudo journalctl -u si-ct -f
【讨论】:
【参考方案2】:就个人而言,我使用一个技巧来打印日志。我使用file = sys.stderr
作为print
语句的参数。以下是出路:
import sys
print("WHATEVER YOU WANT", file = sys.stderr)
完成!
【讨论】:
【参考方案3】:请尝试以下命令:
gunicorn --workers 3 --bind 127.0.0.1:5000 --error-logfile /var/log/gunicorn/error.log --access-logfile /var/log/gunicorn/access.log --capture-output --log-level debug
它确实对我有用。
将--log-level
指定为debug
(默认info
)。
指定--capture-output
标志(默认为false)。
您应该能够查看错误日志文件中的日志。
【讨论】:
无法自动创建?FileNotFoundError: [Errno 2] No such file or directory: '/var/log/gunicorn/error.log'
有没有办法将所有标准输出和标准错误重定向到一个单独的文件而不是--error-log
中指定的文件?【参考方案4】:
我使用 Python3 和 Flask。
我直接使用print('log info')
而不是print('log info', flush=True)
。
我只将capture_output
设置为True
并设置了一个errorlog
文件,它就可以工作了。
注意that:
capture_output
中的指定文件
--capture-output
False
将 stdout/stderr 重定向到 errorlog
我认为你需要指定一个 errorlog 文件来获取标准输出。
这是我的配置文件gunicorn.config.py
设置
accesslog = 'gunicorn.log'
errorlog = 'gunicorn.error.log'
capture_output = True
然后用gunicorn app_py:myapp -c gunicorn.config.py
运行
等价的命令行是
gunicorn app_py:myapp --error-logfile gunicorn.error.log --access-logfile gunicorn.log --capture-output
【讨论】:
【参考方案5】:在 python 3 中,在每个打印语句中添加 flush=True
适用于我的烧瓶/gunicorn 应用程序。
例如
gunicorn --bind 0.0.0.0:8080 server --log-level debug
不需要特定的标志。
看看这是否有帮助。
【讨论】:
更改应用代码来解决这个问题似乎不太方便。【参考方案6】:事实证明,print
语句实际上正在通过,但有延迟。
gunicorn docs for --enable-stdio-inheritance 注释设置PYTHONUNBUFFERED
,我以为我有,但似乎语法错误。
我使用.env
文件和我的foreman
设置解决了这个问题,这样设置变量:
PYTHONUNBUFFERED=TRUE
【讨论】:
尽管这是官方的做法 - 它由于未知原因不起作用(python 2.7)以上是关于有没有办法在 gunicorn 中记录 python 打印语句?的主要内容,如果未能解决你的问题,请参考以下文章
Nginx+Gunicorn+Supervisor+Django 报错