用Django,Nginx,Gunicorn和主管清空日志

时间:2016-01-19 04:53:37

标签: django logging nginx gunicorn supervisor

我的生产环境中的django登录存在问题。我正在使用Nginx + Gunicorn + Supervisorctl来运行我的Django网站。我已经尝试了几天所有的事情,但没有任何结果。

我的想法是拥有两个日志文件,就像我在Django应用程序中定义的那样。一个用于存储所有日志记录(messages.log),另一个用于存储WARNING,ERROR和CRITICAL日志记录(errors.log)

LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
    'verbose': {
        'format': ' [%(asctime)s] [%(levelname)s] [%(name)s] %(message)s'
    },
    'simple': {
        'format': ' %(levelname)s %(message)s'
    },
},
'handlers': {
    'console': {
        'level': 'DEBUG',
        'class': 'logging.StreamHandler',
        'formatter': 'verbose'
    },
    'file': {
        'level': 'DEBUG',
        'class': 'logging.FileHandler',
        'formatter': 'verbose',
        'filename': '/home/myuser/logs/messages.log'
    },
    'file_errors': {
        'level': 'WARNING',
        'class': 'logging.FileHandler',
        'formatter': 'verbose',
        'filename': '/home/myuser/logs/errors.log'
    },
    'mail_admins': {
        'level': 'ERROR',
        'class': 'django.utils.log.AdminEmailHandler',
        'include_html': True
    }
},
'loggers': {
    'main': {
        'handlers': ['console', 'file', 'file_errors', 'mail_admins'],
        'level': 'DEBUG'
    },
    'caching': {
        'handlers': ['console', 'file', 'file_errors'],
        'level': 'DEBUG'
    }
}

使用此日志记录配置,我在我的django应用程序中注册日志记录,其命令如下:

logger = logging.getLogger("main")
logger.info("INFO message")
logger.critical("CRITICAL message")

此命令在我的开发环境中的messages.log和errors.log中注册良好。现在,是时候将应用程序上传到生产环境了。

在制作中,我和主管一起跑着枪。这是我使用supervisor运行gunicorn的配置:

[program:gunicorn_app]
command=gunicorn --bind 172.31.19.71:8000 -c /home/myuser/app/gunicorn.conf.py -p /home/myuser/app/gunicorn.pid wsgi:application
directory=/home/myuser/app
user=myuser
autostart=true
stdout_logfile = /home/myuser/logs/app_supervisor
stderr_logfile = /home/myuser/logs/app_error_supervisor
autorestart=true
redirect_stderr=true

如您所见,我正在使用gunicorn的配置文件,其内容如下:

from __future__ import unicode_literals 
import multiprocessing

bind = "unix:%(proj_path)s/gunicorn.sock"
workers = 4
proc_name = "app_proc"

最后,Nginx配置如下:

server {

    listen 80;
    server_name www.myapp.com;
    client_max_body_size 10M;
    keepalive_timeout    15;
    error_log /home/myser/logs/app_error_nginx.log info;

    ...
}

当我运行我的应用程序时,生成的唯一日志文件是 / home / myuser / logs / app_supervisor ,这是由主管生成的,仅包含有关启动过程的信息。 它是/ home / myuser / logs中包含的唯一文件。

但是,HTTP请求显示在 /var/log/nginx/access.log 上,但即使是/var/log/nginx/errors.log也不会显示来自我的任何错误或警告消息应用程序。

有什么想法吗?

2 个答案:

答案 0 :(得分:9)

我认为理解所有组件以及它们实际记录的内容是很好的。

  • nginx - access.log

    这将记录任何来自nginx的请求,无论请求的性质或类型如何。

  • nginx - error.log

    这将记录来自您已配置的任何后端("上游"在nginx语言中)服务器的错误;如果他们没有处理这些错误。换句话说,如果上游服务器没有配置日志记录并且正在将所有日志发送到stderr - 它将最终被捕获并登录error.log

  • 主管 - stdout_logfile设置

    此处提到的文件记录了主管在开始此条目时生成的任何消息。

  • 主管 - stderr_logfile设置

    如果主管在启动配置过程时遇到错误,则会在此处记录。

  • gunicorn

    gunicorn有两个错误记录器gunicorn.errorgunicorn.access,它们将记录在gunicorn下运行的应用程序的任何错误或stdout / access消息。

  • django logging

    这是第一个生成错误消息然后"向上移动链接"。

因此,当堆栈的每个级别生成错误时,它们要么由该组件处理,要么直接传递到下一个组件,直到最后,如果 nothing 捕获错误消息,它们可能被全局操作系统错误记录器捕获,或者 - 在大多数情况下 - 被静默丢弃。

您的应用中出现错误的原因是您没有按照自己的意愿行事,因为您已使用'disable_existing_loggers': True,禁用了django配置中的所有其他记录器。

这也禁用了gunicorn.errorgunicorn.access - 您的错误日志现在被丢弃,因为它们实际上是由gunicorn处理的,但是您的django配置会禁用记录器。

只需将这两个记录器的相应配置添加到settings.py,或将disable_existing_loggers设置为False,然后重新启动gunicorn进程即可。

答案 1 :(得分:1)

刚刚配置的Django(1.10.6)重定向服务器错误(500)。

# settings.py
from django.utils.log import DEFAULT_LOGGING

# Use defaults as the basis for our logging setup
LOGGING = DEFAULT_LOGGING

# Used to log on supervisor
LOGGING['handlers']['console']['filters'] = ['require_debug_false']
LOGGING['loggers']['django.server']['propagate'] = True

然后观察您的服务器错误(500):

tailf /home/myuser/logs/app_supervisor