Python Django logger在两个级别之间混合:错误和信息
我正在尝试将日志添加到django项目中 以下是我的记录器配置:Python Django logger在两个级别之间混合:错误和信息,python,django,logging,django-settings,django-logging,Python,Django,Logging,Django Settings,Django Logging,我正在尝试将日志添加到django项目中 以下是我的记录器配置: LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'standard': { 'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s', }, }, 'handlers
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s',
},
},
'handlers': {
'default': {
'class': 'logging.FileHandler',
'filename': os.path.join(*[BASE_DIR, 'logfiles', 'debug.log']),
'formatter': 'standard',
},
'apps_errors': {
'level': 'ERROR',
'class': 'logging.FileHandler',
'filename': os.path.join(*[BASE_DIR, 'logfiles', 'apps_errors.log']),
'formatter': 'standard',
},
'dev_logger': {
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': os.path.join(*[BASE_DIR, 'logfiles', 'apps_logs.log']),
'formatter': 'standard',
},
},
'loggers': {
'': {
'handlers': ['default'],
'level': 'DEBUG',
'propagate': False,
},
'gui': {
'handlers': ['dev_logger', 'apps_errors'],
'propagate': True,
},
'crawler': {
'handlers': ['dev_logger', 'apps_errors'],
'propagate': True,
},
},
}
如您所见,我想将所有内容记录到debug.log
并将应用程序(爬虫程序和gui)上的错误记录到应用程序错误。日志
并将应用程序(爬虫程序和gui)上的信息记录到应用程序日志中。日志
debug.log和apps_errors.log工作正常,所有内容都被记录到了
debug.log
,只有我的两个应用中的错误被记录到了apps_errors.log
,但是当涉及到apps_logs.log时,我一直在获取错误和信息,而这应该只是信息
顺便说一下,当我想记录我正在做的事情时
import logging
logger = logging.getLogger(__name__)
关于我正在做的信息:logging.info(我的信息)
对于我正在执行的错误:logging.exception(我的异常)
我也尝试了logging.error(我的异常)
附言:
我曾尝试定义两个记录器,每个处理程序一个,但这样做只会使用错误记录器/处理程序记录错误,信息记录器/处理程序不起作用
'gui': {
'handlers': ['dev_logger'],
'level': 'INFO',
'propagate': True,
},
'gui': {
'handlers': ['apps_errors'],
'level': 'ERROR',
'propagate': True,
如果出于某种原因,您只希望信息消息显示在处理程序的输出中,但没有更高的严重性,那么您需要将筛选器附加到该处理程序。这不是一个常见的要求-虽然隔离日志中的错误和更大的错误是常见的,但仅隔离信息消息并不常见。使用过滤器应该可以:
import logging
class InfoFilter(logging.Filter):
def filter(self, record):
return record.level == logging.INFO
然后将该筛选器分配给处理程序dev\u logger
。不确定为什么称之为“dev_logger”
——也许您需要回顾一下对记录器和处理程序的理解。列表顶部给出了摘要。为处理程序提供的级别是正在记录的最低级别。这意味着INFO
既包括警告
也包括错误
。如果您不想在应用程序日志中记录错误,则必须使用仅由错误处理程序处理的其他记录器来记录错误。@schwobaseggl如下所示:pastebin.com/ZrPwpH0V????我已经试过了,只有错误处理程序有效,信息处理程序无效。。。。。有什么想法吗?那不行。在您的模块中,执行诸如logger=logging.getLogger(\uu name\uuuuu)
和error\u logger=logging.getLogger()
之类的操作,并仅使用后者来记录错误。@schwobasegg我应该执行例如error\u logger=logging.getLogger('error\u logger'),并创建一个名为error\u logger???的记录器吗?这是一个选项,但它扭曲了这个概念。毕竟,你的应用程序日志应该显示你的应用程序中发生了什么。那么,为什么要让它记录常见的东西,而不是重要的东西呢?我称它为dev_logger,因为我将只为开发人员使用logger.info()。。该文件将仅由开发人员访问。。。有什么问题吗?您可以随意调用它,但它是您正在配置的处理程序,而不是记录器。注意,它在一本字典中,有一个键“handlers”…啊,好吧,我明白你的意思了。。你说得对。。。我对伐木很陌生。