登录Django和gunicorn

Pav*_*sev 15 python django logging gunicorn

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

以下是编写日志的代码:

logger = logging.getLogger(__name__)

def home_page(request):
    logger.warning('in home page')
Run Code Online (Sandbox Code Playgroud)

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

这是来自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'},
}
Run Code Online (Sandbox Code Playgroud)

我用以下参数运行gunicorn作为守护进程:

--access-logfile ../access.log --error-logfile --log-level debug ../error.log
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Pav*_*sev 22

我已经解决了我的问题.提供详细信息,以便它可以帮助有类似问题的人.

决定不与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']
    },
}
Run Code Online (Sandbox Code Playgroud)

使用此配置,使用severity> = INFO写入的每条消息都将写入位于源目录外部的文件"logfile".


Ant*_*rts 7

我想为此添加 2021 年的答案,因为服务器日志非常有用,如果不合并几个不同的示例,我就找不到我正在寻找的答案。我在 Heroku 上托管的 Dockerized 应用程序中使用 django==3.1 和 Gunicorn==20.0.4。我只是希望当我运行 docker-compose up 时,我的 Django 服务器日志能够显示在本地标准输出中,以及 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
Run Code Online (Sandbox Code Playgroud)

然后在 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,
        },
    },

})
Run Code Online (Sandbox Code Playgroud)