當Django項目正式部署上線后,我們需要設置DEBUG = False。這時開發者應怎樣檢查Django程序在生產環境運行時有什么異常或錯誤呢?答案就是日志(logging)。在生產環境中,Django默認是不會在服務器上自動生成log文件的,即使程序出現error級別的故障也不會通知管理員。本文將教你如何在Django項目中正確配置日志(logging),讓Django生成log日志文件,并在程序運行發生error級別故障時通知管理員。
在Django項目中,我們可以針對日志的不同級別設置不同的處理方式。比如INFO級別及以上的日志我們寫入到log文件里保存,Error級別及以上的日志我們直接通過郵件發送給系統管理員。
# import the logging library
import logging
# 獲得logger實例
logger = logging.getLogger(__name__)
def my_view(request, arg1, arg):
...
if error_happens:
# Log an error message
logger.error('Something went wrong!')
當Debug=True時,日志信息默認在console輸出。現在我們還需要在django配置文件里配置日志(logging)相關內容,使得當Debug=False時,日志信息會輸出到日志文件里或發送給系統管理員。
以下基本配置信息在django cookiecutter推薦使用的logging配置信息上做了修改,可適合大部分項目使用。如果真的希望發送和接收到郵件還需在settings.py正確配置電子郵箱Email。
# 給ADMINS發送郵件需要配置
ADMINS = (
('admin_name','your@gmail.com'),
)
MANAGERS = ADMINS
# 創建log文件的文件夾
LOG_DIR = os.path.join(BASE_DIR, "logs")
# 基本配置,可以復用的
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': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
},
},
"handlers": { # 定義了三種日志處理方式
"mail_admins": { # 只有debug=False且Error級別以上發郵件給admin
"level": "ERROR",
"filters": ["require_debug_false"],
"class": "django.utils.log.AdminEmailHandler",
},
'file': { # Info級別以上保存到日志文件
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,根據文件大小自動切
'filename': os.path.join(LOG_DIR,"info.log"), # 日志文件
'maxBytes': 1024 * 1024 * 10, # 日志大小 10M
'backupCount': 2, # 備份數為 2
'formatter': 'simple', # 簡單格式
'encoding': 'utf-8',
},
"console": { # 打印到終端console
"level": "DEBUG",
"class": "logging.StreamHandler",
"formatter": "verbose",
},
},
"root": {"level": "INFO", "handlers": ["console"]},
"loggers": {
"django.request": { # Django的request發生error會自動記錄
"handlers": ["mail_admins"],
"level": "ERROR",
"propagate": True, # 向不向更高級別的logger傳遞
},
"django.security.DisallowedHost": { # 對于不在 ALLOWED_HOSTS 中的請求不發送報錯郵件
"level": "ERROR",
"handlers": ["console", "mail_admins"],
"propagate": True,
},
},
}