有没有办法在 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-outputFalse 将 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 报错

对文件进行更改时重新启动 Gunicorn/Nginx

Gunicorn 配置参数

Gunicorn 与多个工人:有没有一种简单的方法可以只执行一次某些代码?

flask + supervisor + gunicorn

Gunicorn 不会从 nginx 记录真实 ip