日志在程序開發(fā)中是少不了的,通過日志我們可以分析到錯(cuò)誤在什么地方,有什么異常。在生產(chǎn)環(huán)境下有很大的用處。在java 開發(fā)中通常用 log4j,logback 等三方組件。那么在 django中是怎么處理日志的呢。django 利用的就是python 提供的 logging模塊,但django中要用logging ,還得有一定的配置規(guī)律,需要在setting 中配置:
程序代碼
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': '%(asctime)s [%(threadName)s:%(thread)d] [%(name)s:%(lineno)d] [%(levelname)s]- %(message)s'
},
},
'filters': {
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'include_html': True,
},
'default': {
'level':'DEBUG',
'class':'logging.handlers.RotatingFileHandler',
'filename': os.path.join(STATIC_ROOT+'/logs/','all.log'), #或者直接寫路徑:'c:\logs\all.log',
'maxBytes': 1024*1024*5, # 5 MB
'backupCount': 5,
'formatter':'standard',
},
'console':{
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'standard'
},
'request_handler': {
'level':'DEBUG',
'class':'logging.handlers.RotatingFileHandler',
'filename': os.path.join(STATIC_ROOT+'/logs/','script.log'), #或者直接寫路徑:'filename':'c:\logs\request.log''
'maxBytes': 1024*1024*5, # 5 MB
'backupCount': 5,
'formatter':'standard',
},
'scprits_handler': {
'level':'DEBUG',
'class':'logging.handlers.RotatingFileHandler',
'filename': os.path.join(STATIC_ROOT+'/logs/','script.log'), #或者直接寫路徑:'filename':'c:\logs\script.log'
'maxBytes': 1024*1024*5, # 5 MB
'backupCount': 5,
'formatter':'standard',
},
},
'loggers': {
'django': {
'handlers': ['default','console'],
'level': 'DEBUG',
'propagate': False
},
'XieYin.app':{
'handlers': ['default','console'],
'level': 'DEBUG',
'propagate': True
},
'django.request': {
'handlers': ['request_handler'],
'level': 'DEBUG',
'propagate': False
},
'scripts': { # 腳本專用日志
'handlers': ['scprits_handler'],
'level': 'INFO',
'propagate': False
},
}
}
下面專門講解一下: 其實(shí)這個(gè)配置與python 傳統(tǒng)的logging 很類似.
formatters 用來配置 日志打印的格式
handlers ,用來定義具體處理日志的方式,可以定義很多種,"default" 就是默認(rèn)方式,"console" 就是打印到控制臺(tái)方式.
loggers 是用來配置用哪幾種 handlers 來處理日志,比如你同時(shí)需要輸出日志到文件,和到控制臺(tái),那就必須配置 兩種handlers. 在上面的例子中 'XieYin.app" 是典型的例子.
有一點(diǎn)必須注意的是 loggers 類型 為"django" 這將處理所有類型的日志.
另外 為什么我配置了一個(gè) 'XieYin.app' 的logger,這是因?yàn)?django 會(huì)根據(jù)包的層次結(jié)構(gòu)去找 應(yīng)該用那個(gè) logger 來處理日志,如果找不到,就不輸出日志,而我的項(xiàng)目要輸出日志的views.py 都是是放在 XieYin.app 下面的。而且當(dāng)系統(tǒng)查找是否配置有相應(yīng)的logger的時(shí)候,如果本身這個(gè)module 沒有l(wèi)ogger ,就查找父類是否有l(wèi)ogger。比如有一個(gè)module:XieYin.app.comment.views. 如果在這里面用如下方式寫日志:
views.py 中
程序代碼
import logging
logger = logging.getLogger('XieYin.app')
logger.info('aaa')
logger.error('error occurs')
這個(gè)時(shí)候也會(huì)找到 XieYin.app 去處理,雖然沒有定義 "XieYin.app.comment.views" 這樣的logger,它會(huì)再他的父類找。
知道了原理,在view中就如同上面介紹的那樣,應(yīng)用就好了
程序代碼
import logging
logger = logging.getLogger(__name__) # 這里用__name__通用,自動(dòng)檢測(cè).
logger.info('aaa')
logger.error('error')
你如果既想看 自己在程序中輸出的日志,又想看django自己輸出的日志,特別是sql 語句,那么根據(jù)上面介紹的,你可以這樣做:
程序代碼
import logging
logger = logging.getLogger('django') # 這里用__name__通用,自動(dòng)檢測(cè).
logger.info('aaa')
logger.error('error')
這樣,所有的日志你都能看到,包括 django.db.backends 數(shù)據(jù)庫sql語句的日志