django - 使用 Django、Nginx、Gunicorn 和 supervisor 进行空日志记录

标签 django nginx logging gunicorn supervisord

我的 django 在我的生产环境中登录时遇到问题。我正在使用 Nginx+Gunicorn+Supervisorctl 来运行我的 Django 网站。我已经尝试了几乎所有的东西两天没有任何结果。

我的想法是在我的 Django 应用程序中定义两个日志文件。一个存储所有日志记录 (messages.log),另一个存储警告、错误和关键日志记录 (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 中注册得很好。现在,是时候将应用程序上传到生产环境了。

在生产中,我与主管一起运行 gunicorn。这是我使用主管运行 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 也不显示来自我的应用程序的任何错误或警告消息。

任何想法?

最佳答案

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

  • nginx - access.log
    这将记录任何发送到 nginx 的请求,而不管请求的性质或种类。
  • nginx - error.log
    这将记录来自您配置的任何后端(nginx 语言中的“上游”)服务器的错误;如果他们不处理这些错误。换句话说,如果上游服务器没有配置日志记录并将所有日志发送到 stderr - 它最终将被捕获并记录在 error.log 中。
  • 主管 - stdout_logfile 设置

    此处提到的文件记录了启动此条目时主管生成的任何消息。
  • 主管 - stderr_logfile 设置

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

    gunicorn 有两个错误记录器 gunicorn.errorgunicorn.access,它们将记录在 gunicorn 下运行的应用程序的任何错误或标准输出/访问消息。
  • Django 日志记录

    这是首先生成错误消息然后“向上移动”的地方。

  • 因此,由于在堆栈的每个级别都会生成错误,它们要么由该组件处理,要么只是传递到下一个组件直到最后,如果没有捕获错误消息,它们可能会被全局操作系统错误捕获logger 或 - 在大多数情况下 - 默默地丢弃。

    在您的应用程序中,您的错误没有执行应有的操作的原因是您已使用 'disable_existing_loggers': True, 禁用了 django 配置中的所有其他记录器。

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

    只需将这两个记录器的适当配置添加到您的 settings.py ,或将 disable_existing_loggers 设置为 False ,然后重新启动 gunicorn 进程,一切都会正常进行。

    关于django - 使用 Django、Nginx、Gunicorn 和 supervisor 进行空日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34868713/

    相关文章:

    Java Logger 对象不附加到日志文件

    javascript - 关于 django 模板中表单字段值的动态隐藏/取消隐藏选项卡

    Django 跨反向关系聚合

    ruby-on-rails - Devise 无法登录 Google Chrome

    ruby-on-rails - Rails Assets 未在Docker上加载

    Android 4.0.3 并完成 Activity

    python - 用于显示 Django 版本的 Django 模板标签

    python - Django 1.7 中不再支持数字键选择吗?

    node.js - 在 NGINX 中托管 Express js api

    php - MySQL 插入语句队列