我正在使用 Django + Python + Gunicorn + Nginx + MySQL 技术栈创建一个社交交友网站:www.tomonotomo.com
我的 Django 中的 settings.py 文件如下:
DEBUG = False
TEMPLATE_DEBUG = False
ADMINS = (
('Pratik Poddar', 'xxxxxxxxxxx'),
)
MANAGERS = ADMINS
FAILED_RUNS_CRONJOB_EMAIL_PREFIX = "[Django - Tomonotomo - Cron Job] "
EMAIL_SUBJECT_PREFIX = "[Django - Tomonotomo] "
.....
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
}
},
'handlers': {
'null': {
'level': 'INFO',
'class': 'logging.NullHandler'
},
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django': {
'handlers': ['null'],
'level': 'INFO',
'propagate': True,
},
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}
我的 gunicorn 配置(编辑:supervisor 配置)如下:
stdout_logfile = /home/ubuntu/gunicorn_tomonotomo_supervisor.log
redirect_stderr = true
我的 nginx 配置有:
access_log /home/ubuntu/tomonotomo-access.log;
error_log /home/ubuntu/tomonotomo-error.log error;
我无法看到我的错误日志。我不想将 debug 设置为 True,因为它在生产中。我也没有收到任何邮件。
我希望所有日志都保存在一个文件中,并每天早上将所有错误通过电子邮件发送给我。我怎样才能实现这一点?非常感谢。
解决方法
-
将 DEBUG 设置为 False,将 TEMPLATE_DEBUG 设置为 False,以禁用 Django 的调试功能。
-
在 LOGGING 配置中,添加一个新的处理程序,将日志级别设置为 INFO,并将其类设置为
logging.FileHandler。将此处理程序添加到django和django.request日志记录器的处理程序列表中。 -
在 LOGGING 配置中,添加一个新的格式器,将格式设置为
%(asctime)s - %(levelname)s - %(message)s。将此格式器添加到file处理程序的格式器列表中。 -
在 gunicorn 配置中,将
--log-file参数设置为日志文件的路径。 -
在 nginx 配置中,将
error_log参数设置为日志文件的路径。
以下是更新后的 LOGGING 配置:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
}
},
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'simple': {
'format': '%(asctime)s - %(levelname)s - %(message)s'
}
},
'handlers': {
'null': {
'level': 'INFO',
'class': 'logging.NullHandler'
},
'file': {
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': '/home/ubuntu/tomonotomo.log',
'formatter': 'simple'
},
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'INFO',
'propagate': True,
},
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}
以下是更新后的 gunicorn 配置:
stdout_logfile = /home/ubuntu/gunicorn_tomonotomo_supervisor.log
redirect_stderr = true
log_file = /home/ubuntu/gunicorn_tomonotomo_supervisor.log
以下是更新后的 nginx 配置:
access_log /home/ubuntu/tomonotomo-access.log;
error_log /home/ubuntu/tomonotomo-error.log;
现在,所有日志都将保存在 /home/ubuntu/tomonotomo.log 文件中,所有错误都将通过电子邮件发送给管理员。