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

edu*_*eja 3 django logging nginx supervisord gunicorn

我的生产环境中的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'
    }
}
Run Code Online (Sandbox Code Playgroud)

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

logger = logging.getLogger("main")
logger.info("INFO message")
logger.critical("CRITICAL message")
Run Code Online (Sandbox Code Playgroud)

这些命令在我的开发环境中的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
Run Code Online (Sandbox Code Playgroud)

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

from __future__ import unicode_literals 
import multiprocessing

bind = "unix:%(proj_path)s/gunicorn.sock"
workers = 4
proc_name = "app_proc"
Run Code Online (Sandbox Code Playgroud)

最后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;

    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

任何的想法?

Bur*_*lid 10

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

  • nginx - access.log

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

  • nginx - error.log

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

  • 主管 - stdout_logfile设定

    此处提到的文件记录了主管在启动此条目时生成的任何消息.

  • 主管 - stderr_logfile设定

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

  • gunicorn

    gunicorn有两个错误记录器gunicorn.errorgunicorn.access其中将记录应用的任何错误或标准输出/接入消息被下gunicorn运行.

  • django伐木

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

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

您的应用程序中出现错误的原因是他们应该执行的操作是因为您已禁用django配置中的所有其他记录器'disable_existing_loggers': True,.

这也被禁用gunicorn.errorgunicorn.access-因为它们实际上是由gunicorn处理您的错误日志现在被取消了,但记录器是通过你的Django配置中禁用.

只需将这两个记录器的相应配置添加到您的settings.py,或设置disable_existing_loggersFalse然后重新启动gunicorn进程,一切都应该工作.