我在views.py上面有以下行以启用日志记录:
logger = logging.getLogger(__name__)
要将所有记录器的loglevel更改为debug,我已将以下行放入settings.py:
if DEBUG:
logging.getLogger().setLevel(logging.DEBUG)
但是如果我在views.py中使用loglevel INFO记录某些东西,它就不会显示出来。为什么呢?
答案 0 :(得分:3)
要获取django
层次结构之外的任何日志记录,您必须为自己的层次结构配置记录器(或配置“root”记录器,但您可能获得的要求远远超过您的要求) - Django仅默认配置django
层次结构。你可以see some examples here,特别是“相当复杂的日志设置”(实际上与我们相比很简单):
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(message)s'
},
},
'filters': {
'special': {
'()': 'project.logging.SpecialFilter',
'foo': 'bar',
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': {
'console': {
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler',
'filters': ['special']
}
},
'loggers': {
'django': {
'handlers': ['console'],
'propagate': True,
},
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': False,
},
'myproject.custom': {
'handlers': ['console', 'mail_admins'],
'level': 'INFO',
'filters': ['special']
}
}
}
注意最后一个条目 - 这是您为自己的项目/应用程序(或第三方应用程序或库FWIW)添加日志记录的方式。
wrt /根据DEBUG
标志更改级别,我所做的是在{}之前定义DEFAULT_LOGGING_LEVEL
:
# settings.py
DEBUG = <....>
# ....
DEFAULT_LOGGING_LEVEL = "DEBUG" if DEBUG else "INFO"
然后将它用于所有记录器,除了那些我想要更具体的记录器:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(name)s %(module)s '
'%(process)d %(thread)d %(message)s'
},
'simple': {
"datefmt": "%Y-%m-%d %H:%M:%S %z",
'format': '[%(asctime)s] [%(process)d] [%(levelname)s] %(name)s %(message)s',
},
},
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
}
},
'handlers': {
'null': {
'level': 'DEBUG',
'class': 'logging.NullHandler',
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'simple',
},
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'formatter': 'verbose',
'include_html': True
},
'warn_admins': {
'level': 'WARN',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler',
'formatter': 'verbose',
'include_html': True
},
},
'loggers': {
# ----------------------------------------
# general
# ----------------------------------------
# make sure we have anything >= WARN whatsoever
'root': {
'handlers': ["console"],
'level': "WARN",
'formatter': "verbose",
},
# ----------------------------------------
# apps loggers - django (default)
# ----------------------------------------
'django': {
'handlers': ["console",],
'level': "INFO",
'formatter': "verbose",
'propagate': True,
},
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
# ----------------------------------------
# app loggers - third part
# ----------------------------------------
'reportlab.platypus': {
'handlers': ['console'],
'level': 'DEBUG',
'propagate': True,
},
# ----------------------------------------
# app loggers - our own apps
# ----------------------------------------
'account': {
'handlers': ["console",],
'level': DEFAULT_LOGGING_LEVEL,
'propagate': True,
},
'core': {
'handlers': ["console",],
'level': DEFAULT_LOGGING_LEVEL,
'propagate': True,
},
'shop': {
'handlers': ["console",],
'level': DEFAULT_LOGGING_LEVEL,
'propagate': True,
},
'shop.views': {
'handlers': ["console", "warn_admins"],
'level': DEFAULT_LOGGING_LEVEL,
'propagate': True,
},
# etc
您可以注意到我不必手动调用logging
模块本身,所有操作都通过LOGGING
dict完成(Djano负责将其传递给logging.dictConfig()
)。
注意:dictConfig
格式已完全记录,因此我不会在此解释。