我在生产环境中使用Nginx+Gunicorn+Supervisorctl运行我的Django网站,但是在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。以下是我使用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,这是由supervisor生成的,仅包含有关进程启动的信息。它是/home/myuser/logs中唯一的文件。
但是,HTTP请求显示在/var/log/nginx/access.log上,但即使/var/log/nginx/errors.log也不显示来自我的应用程序的任何错误或警告消息。
有什么想法吗?
disable_existing_loggers
设置为False
即可。我尝试配置gunicorn.error
和gunicorn.access
日志,但无法使它们工作...但是不禁用现有的记录器现在使我的日志平稳运行。再次感谢! - educalleja