Settings 中 日志的配置
在settings中配置LOGGINGS文件,在BASE_DIR目录下创建相应的文件夹就可以生成相应的运行日志了。通过日志我们可以分析到错误在什么地方,有什么异常。在生产环境下有很大的用处。
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'),
'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'),
'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'),
'maxBytes': 1024*1024*5, # 5 MB
'backupCount': 5,
'formatter':'standard',
},
},
'loggers': {
'django': {
'handlers': ['default','console'],
'level': 'DEBUG',
'propagate': False
},
'Lvze.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. 在上面的例子中'Lvze.app" 是典型的例子。有一点必须注意的是 loggers 类型为"django" 这将处理所有类型的日志。另外为什么我配置了一个 'Lvze.app' 的logger,这是因为 django 会根据包的层次结构去找 应该用那个 logger 来处理日志,如果找不到,就不输出日志,而我的项目要输出日志的views.py 都是是放在 Lvze.app 下面的。而且当系统查找是否配置有相应的logger的时候,如果本身这个module 没有logger ,就查找父类是否有logger。比如有一个module:Lvze.app.comment.views. 如果在这里面用如下方式写日志:
views.py 中
程序代码程序代码
import logging
logger = logging.getLogger('Lvze.app')
logger.info('aaa')
logger.error('error occurs')
这个时候也会找到 Lvze.app 去处理,虽然没有定义 "Lvze.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')
这样,所有的日志你都能看到,包括 django.db.backends 数据库sql语句的日志。
实际上很多配置文件配置日志部分都大同小异,很多可以公用,所以不必每次都从头编写,往往复制已有的进行修改即可。