日志在程序開發中是少不了的,通過日志我們可以分析到錯誤在什么地方,有什么異常。在生產環境下有很大的用處。在java 開發中通常用 log4j,logback 等三方組件。那么在 django中是怎么處理日志的呢。django 利用的就是python 提供的
logging模塊. 在前面有一篇文章專門講過 python的 logging ,但django中要用logging ,還得有一定的配置規律,需要在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
},
}
}
下面專門講解一下: 其實這個配置與python 傳統的logging 很類似.
formatters 用來配置 日志打印的格式
handlers ,用來定義具體處理日志的方式,可以定義很多種,"default" 就是默認方式,"console" 就是打印到控制台方式.
loggers 是用來配置用哪幾種 handlers 來處理日志,比如你同時需要輸出日志到文件,和到控制台,那就必須配置 兩種handlers. 在上面的例子中 'XieYin.app" 是典型的例子.
有一點必須注意的是 loggers 類型 為"django" 這將處理所有類型的日志.
另外 為什么我配置了一個 'XieYin.app' 的logger,這是因為 django 會根據包的層次結構去找 應該用那個 logger 來處理日志,如果找不到,就不輸出日志,而我的項目要輸出日志的views.py 都是是放在 XieYin.app 下面的。而且當系統查找是否配置有相應的logger的時候,如果本身這個module 沒有logger ,就查找父類是否有logger。比如有一個module:XieYin.app.comment.views. 如果在這里面用如下方式寫日志:
views.py 中
import logging
logger = logging.getLogger('XieYin.app')
logger.info('aaa')
logger.error('error occurs')
這個時候也會找到 XieYin.app 去處理,雖然沒有定義 "XieYin.app.comment.views" 這樣的logger,它會再他的父類找。
知道了原理,在view中就如同上面介紹的那樣,應用就好了
import logging
logger = logging.getLogger(__name__) # 這里用__name__通用,自動檢測.
logger.info('aaa')
logger.error('error')
你如果既想看 自己在程序中輸出的日志,又想看django自己輸出的日志,特別是sql 語句,那么根據上面介紹的,你可以這樣做:
import logging
logger = logging.getLogger('django') # 這里用__name__通用,自動檢測.
logger.info('aaa')
logger.error('error')
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
},
}
}
下面專門講解一下: 其實這個配置與python 傳統的logging 很類似.
formatters 用來配置 日志打印的格式
handlers ,用來定義具體處理日志的方式,可以定義很多種,"default" 就是默認方式,"console" 就是打印到控制台方式.
loggers 是用來配置用哪幾種 handlers 來處理日志,比如你同時需要輸出日志到文件,和到控制台,那就必須配置 兩種handlers. 在上面的例子中 'XieYin.app" 是典型的例子.
有一點必須注意的是 loggers 類型 為"django" 這將處理所有類型的日志.
另外 為什么我配置了一個 'XieYin.app' 的logger,這是因為 django 會根據包的層次結構去找 應該用那個 logger 來處理日志,如果找不到,就不輸出日志,而我的項目要輸出日志的views.py 都是是放在 XieYin.app 下面的。而且當系統查找是否配置有相應的logger的時候,如果本身這個module 沒有logger ,就查找父類是否有logger。比如有一個module:XieYin.app.comment.views. 如果在這里面用如下方式寫日志:
views.py 中
程序代碼
import logging
logger = logging.getLogger('XieYin.app')
logger.info('aaa')
logger.error('error occurs')
這個時候也會找到 XieYin.app 去處理,雖然沒有定義 "XieYin.app.comment.views" 這樣的logger,它會再他的父類找。
知道了原理,在view中就如同上面介紹的那樣,應用就好了
程序代碼
import logging
logger = logging.getLogger(__name__) # 這里用__name__通用,自動檢測.
logger.info('aaa')
logger.error('error')
你如果既想看 自己在程序中輸出的日志,又想看django自己輸出的日志,特別是sql 語句,那么根據上面介紹的,你可以這樣做:
程序代碼
import logging
logger = logging.getLogger('django') # 這里用__name__通用,自動檢測.
logger.info('aaa')
logger.error('error')
