登录 Django 和 gunicorn

Posted

技术标签:

【中文标题】登录 Django 和 gunicorn【英文标题】:Logging in Django and gunicorn 【发布时间】:2015-02-26 01:39:53 【问题描述】:

我正在使用 gunicorn 运行 django 应用程序,但我看不到我正在编写的任何日志消息。

这是写日志的代码:

logger = logging.getLogger(__name__)

def home_page(request):
    logger.warning('in home page')

(注意:这段代码肯定会运行,因为这是通向主页的视图)

这是我在 settings.py 中的日志配置:

LOGGING = 
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': 
        'console': 
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'stream': sys.stdout,
        ,
    ,
    'loggers': 
        'django': 
            'handlers': ['console'],
        ,
    ,
    'root': 'level': 'INFO',

我使用以下参数将 gunicorn 作为守护程序运行:

--access-logfile ../access.log --error-logfile --log-level debug ../error.log

access.log 和 error.log 都被创建并填充了 gunicorn 消息,但我看不到我写的消息。

谢谢

【问题讨论】:

【参考方案1】:

我已经解决了我的问题。提供详细信息,以便可能对遇到类似问题的人有所帮助。

决定不与 gunicorn 和 django 日志混淆,并为 django 创建单独的日志文件。

LOGGING = 
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': 
        'console': 
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        ,
        'logfile': 
            'level':'DEBUG',
            'class':'logging.FileHandler',
            'filename': BASE_DIR + "/../logfile",
        ,
    ,
    'root': 
        'level': 'INFO',
        'handlers': ['console', 'logfile']
    ,

使用此配置,每条使用严重性 >= INFO 写入的消息都将写入位于源目录之外的文件“logfile”。

【讨论】:

谢谢!我很难找到像这样与 gunicorn 一起使用的基本示例。 我认为它实际上是默认写入stderr的。要将其写入标准输出,您应该添加另一个具有指定流的处理程序,如下所示:'console_stdout': 'level': 'DEBUG', 'stream': sys.stdout, 'class': 'logging.StreamHandler' @PavelRyvintsev 请问'root'参数是干什么用的?我们真的需要它吗? 是的。 root 参数意味着来自所有模块的日志都由“控制台”和“日志文件”处理程序处理。您可以配置各种模块以由不同的处理程序处理。 如果您运行应用程序的多个实例,全部写入该日志文件,这不会引入问题吗?【参考方案2】:

我想为此添加一个 2021 年的答案,因为服务器日志非常有用,而且我找不到我正在寻找的答案,而无需合并几个不同的示例。我在 Heroku 上托管的 Dockerized 应用程序中使用 django==3.1 和 gunicorn==20.0.4。我只是希望我的 Django 服务器日志在我运行 docker-compose up 时显示在我的本地标准输出中,以及在 Heroku 上的 papertrail 日志中显示。这对我有用。

# In Dockerfile, I created a location for the logs, 
# and point there when starting gunicorn
RUN mkdir /logs
CMD gunicorn app.wsgi:application --bind 0.0.0.0:$PORT --workers 3 --capture-output --access-logfile /logs/gunicorn-access.log

然后在 Django 设置中,我将它用于 logging_dict:

import logging.config
# Clear prev config
LOGGING_CONFIG = None
logging.config.dictConfig(
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': 
        'console': 
            'format': '%(message)s',
        ,
    ,
    'handlers': 
        'console': 
            'class': 'logging.StreamHandler',
            'formatter': 'console',
        ,
    ,
    'loggers': 
        'gunicorn':  # this was what I was missing, I kept using django and not seeing any server logs
            'level': 'INFO',
            'handlers': ['console'],
            'propagate': True,
        ,
    ,

)

【讨论】:

能否指出打印的位置错误日志和应用日志? 这会将日志打印到标准输出,即 StreamHandler 默认值,如开头段落中所述。所以位置是标准输出,可以通过 papertrail 访问。 我希望我能投票一千次。这是我在 2 天内发现的唯一提及 loggers.gunicorn 试图让 New Relic “上下文中的日志”与 gunicorn 一起工作的头撞墙 谢谢拉里。这条评论让我笑了,我很高兴它有帮助。

以上是关于登录 Django 和 gunicorn的主要内容,如果未能解决你的问题,请参考以下文章

无法使用有效的用户名和密码登录 django 管理页面

在django中创建帐户后无法登录

在 django 2.2.5 中使用用户名和密码登录

自定义Django登录,无法比较密码

登录 Django 和 gunicorn

用Django设计一个简单的注册和登录界面