django 1.8 日志配置
以下为setings配置logging代码片段
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) LOGDIR = os.path.join(BASE_DIR, "logs") LOGFILE = datetime.datetime.now().strftime("%Y-%m-%d") + ".log" if not os.path.exists(LOGDIR): os.makedirs(LOGDIR) # 创建路径 if os.path.isfile(os.path.join(LOGDIR, LOGFILE)): # 重启的时候删除原始文件 os.remove(os.path.join(LOGDIR, LOGFILE)) 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(LOGDIR, LOGFILE), # 或者直接写路径:'c:\logs\all.log', 'mode': 'w+', '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(LOGDIR, 'request_handler.log'), #或者直接写路径:'filename':'c:\logs\request.log'' 'maxBytes': 1024*1024*5, # 5 MB 'backupCount': 5, 'formatter':'standard', }, 'scripts_handler': { 'level':'DEBUG', 'class':'logging.handlers.RotatingFileHandler', 'filename': os.path.join(LOGDIR, '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 }, 'django.request': { 'handlers': ['request_handler'], 'level': 'DEBUG', 'propagate': False }, 'scripts': { # 脚本专用日志 'handlers': ['scripts_handler'], 'level': 'INFO', 'propagate': False }, 'app_name': { 'handlers': ['default'], 'level': 'INFO', } } }
下面专门讲解一下: 其实这个配置与python 传统的logging 很类似.
formatters 用来配置 日志打印的格式
handlers ,用来定义具体处理日志的方式,可以定义很多种,"default" 就是默认方式,"console" 就是打印到控制台方式.
loggers 是用来配置用哪几种 handlers 来处理日志,比如你同时需要输出日志到文件,和到控制台,那就必须配置 两种handlers. 在上面的例子中 'app_name" 是典型的例子.
有一点必须注意的是 loggers 类型 为"django" 这将处理所有类型的日志.
另外 为什么我配置了一个 'app_name' 的logger,这是因为 django 会根据包的层次结构去找 应该用那个 logger 来处理日志,如果找不到,就不输出日志,而我的项目要输出日志的views.py 都是是放在 app_name 下面的。而且当系统查找是否配置有相应的logger的时候,如果本身这个module 没有logger ,就查找父类是否有logger。比如有一个module:app_name.views. 如果在这里面用如下方式写日志:
# vi views.py
import logging
logger = logging.getLogger('app_name')
logger.info('my app')
logger.error('error')
这个时候也会找到 app_name 去处理,虽然没有定义 "app_name.views" 这样的logger,它会再他的父类找。
知道了原理,在view中就如同上面介绍的那样,应用就好了
# vi views.py
import logging
logger = logging.getLogger(__name__) # 这里用__name__通用,自动检测.
logger.info('my app')
logger.error('error')
你如果既想看 自己在程序中输出的日志,又想看django自己输出的日志,特别是sql 语句,那么根据上面介绍的,你可以这样做:
#vi views.py
import logging
logger = logging.getLogger('django') # 这里用__name__通用,自动检测.
logger.info('my app')
logger.error('error')
这样,所有的日志你都能看到,包括 django.db.backends 数据库sql语句的日志
官网日志配置讲解:
https://docs.djangoproject.com/en/1.8/ref/settings/#std:setting-LOGGING
https://docs.djangoproject.com/en/1.8/topics/logging/#configuring-logging
.