我的生产环境中的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也不会显示来自我的应用程序的任何错误或警告消息.
任何的想法?
解决方法:
我认为理解所有组件以及它们实际记录的内容是很好的.
> nginx – access.log
这将记录任何来自nginx的请求,无论请求的性质或类型如何.
> nginx – error.log
这将记录来自您已配置的任何后端(nginx语言中的“上游”)服务器的错误;如果他们没有处理这些错误.换句话说,如果上游服务器没有配置日志记录并且正在将所有日志发送到stderr – 它将最终被捕获并记录在error.log中.
> supervisor – stdout_logfile设置
此处提到的文件记录了主管在启动此条目时生成的任何消息.
> supervisor – stderr_logfile设置
如果主管在启动配置的过程时遇到错误,则会在此处记录.
> gunicorn
gunicorn有两个错误记录器gunicorn.error和gunicorn.access,它将记录在gunicorn下运行的应用程序的任何错误或stdout / access消息.
> django伐木
这是第一个生成错误消息,然后“向上移动链”.
因此,当您的堆栈的每个级别生成错误时,它们要么由该组件处理,要么直接传递到下一个组件,直到最后,如果没有捕获错误消息,它们可能会被全局操作系统错误捕获记录器或 – 在大多数情况下 – 无声地丢弃.
您的应用程序中出现错误的原因是他们应该执行的操作是因为您已使用“disable_existing_loggers”禁用了django配置中的所有其他记录器:True,.
这也禁用了gunicorn.error和gunicorn.access – 您的错误日志现在被丢弃,因为它们实际上是由gunicorn处理的,但是您的django配置会禁用记录器.
只需将这两个记录器的相应配置添加到settings.py,或将disable_existing_loggers设置为False,然后重新启动gunicorn进程,一切都应该可行.