前言
Django對于日志輸出的信息是很完善的,request的信息,setting配置,trackback的信息,一應俱全,足夠我們調試了。但是在線上環境,如果讓用戶看到這些信息,是很不安全的(暴露代碼)。所以在線上我們要關閉Debug,但是又不能扔掉這些調試信息,這就要用到logging模塊。
logging模塊其實是Python的模塊,在Django中有很多本地化的支持。
理解Logger
首先要理解logging的工作,這里面主要有四個東西:格式器formatter,過濾器filter,處理器handler,日志實例logger。
處理流程
formatterlogger ----> handler ----------------> files, emails filter
處理流程是這樣的。首先,在代碼中。我們拿到的是logger實例,通過這個實例來記錄信息。
# import the logging libraryimport logging # Get an instance of a loggerlogger = logging.getLogger('django') def my_view(request, arg1, arg): ... if bad_mojo: # Log an error message logger.error('Something went wrong!')
然后,名字是django的這個logger就會把信息交給相應的handler,handler把信息用formater和filter處理一下,提交log(保存到文件,數據庫,或者發送郵件)。
一般來說,handler可以是send_email,error_file等負責處理的方式,在logger中可以重復使用handler。例如我們的django處理器使用了send_email, error_file 這兩個處理器,request處理器使用error_file,info_file兩個處理器,logger和handler可以理解成多對多的關系,嘻嘻。
配置方式
Python中可以使用多種格式配置logging,比如.conf, .ini等。
在Django中,我們是把有關logging的配置寫到settings里面。相應的配置及解釋如下(僅供參考)。
#管理員郵箱ADMINS = ( ('laixintao','*******@163.com'),) #非空鏈接,卻發生404錯誤,發送通知MANAGERSSEND_BROKEN_LINK_EMAILS = TrueMANAGERS = ADMINS #Email設置EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'EMAIL_HOST= 'smtp.163.com'#QQ郵箱SMTP服務器(郵箱需要開通SMTP服務)EMAIL_PORT= 25 #QQ郵箱SMTP服務端口EMAIL_HOST_USER = '**********@163.com' #我的郵箱帳號EMAIL_HOST_PASSWORD = '**************' #授權碼EMAIL_SUBJECT_PREFIX = 'website' #為郵件標題的前綴,默認是'[django]'EMAIL_USE_TLS = True #開啟安全鏈接DEFAULT_FROM_EMAIL = SERVER_EMAIL = EMAIL_HOST_USER #設置發件人 #logging日志配置LOGGING = { 'version': 1, 'disable_existing_loggers': True, 'formatters': {#日志格式 'standard': { 'format': '%(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s'} }, 'filters': {#過濾器 'require_debug_false': { '()': 'django.utils.log.RequireDebugFalse', } }, 'handlers': {#處理器 'null': { 'level': 'DEBUG', 'class': 'logging.NullHandler', }, 'mail_admins': {#發送郵件通知管理員 'level': 'ERROR', 'class': 'django.utils.log.AdminEmailHandler', 'filters': ['require_debug_false'],# 僅當 DEBUG = False 時才發送郵件 'include_html': True, }, 'debug': {#記錄到日志文件(需要創建對應的目錄,否則會出錯) 'level':'DEBUG', 'class':'logging.handlers.RotatingFileHandler', 'filename': os.path.join(BASE_DIR, "log",'debug.log'),#日志輸出文件 'maxBytes':1024*1024*5,#文件大小 'backupCount': 5,#備份份數 'formatter':'standard',#使用哪種formatters日志格式 }, 'console':{#輸出到控制臺 'level': 'DEBUG', 'class': 'logging.StreamHandler', 'formatter': 'standard', }, }, 'loggers': {#logging管理器 'django': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': False }, 'django.request': { 'handlers': ['debug','mail_admins'], 'level': 'ERROR', 'propagate': True, }, # 對于不在 ALLOWED_HOSTS 中的請求不發送報錯郵件 'django.security.DisallowedHost': { 'handlers': ['null'], 'propagate': False, }, } }
新聞熱點
疑難解答