【发布时间】:2021-01-24 04:21:07
【问题描述】:
tl;dr:有没有办法让一个记录器管理所有日志级别?
要登录我的项目,我正在运行:
logger = logging.getLogger('info.contract')
logger.info("Some info message...")
将2021-01-24 03:05:02,063 [contract_generator] Some info message... 打印到控制台。
info.contract 记录器在我的settings.py 中定义:
'loggers': {
'info': {
'handlers' : ['info_logfile'],
'level': 'INFO',
},
'info.contract': {
'handlers': ['contract_info_logfile'],
'level': 'INFO',
'propagate': True,
}
},
'handlers': {
'info_logfile': {
'class': 'logging.FileHandler',
'filename': 'info.log',
'formatter': 'default',
},
'contract_info_logfile': {
'class': 'logging.FileHandler',
'filename': 'contract.info.log',
'formatter': 'default',
}
}
'formatters': {
'default': {
'format': '%(asctime)s [%(module)s] %(message)s',
}
}
}
我遇到的问题如下:
为了根据日志级别记录到不同的文件,我必须为每个日志级别创建一个新的记录器。也就是说,以下不起作用:
logger = logging.getLogger('info.contract')
logger.info("Some info message...")
## this part is new
logger.debug("Some debug message...")
由于logger 使用settings.py 中定义的info.contract 记录器,其'level' 设置设置为'INFO'(如上所示)。有趣的是,我没有收到任何错误。当我使用 .debug() 函数时,记录器根本不会记录条目。
因此,为了根据日志级别记录到不同的文件,我确实必须为每个日志级别创建一个新的记录器,即使这会产生大量重复代码:
##---snip---##
'loggers': {
'info': {
'handlers' : ['std_err', 'info_logfile'],
'level': 'INFO',
},
'info.contract': {
'handlers': ['contract_info_logfile'],
'level': 'INFO',
'propagate': True,
}
'debug': { ## duplicate code
'handlers' : ['std_err', 'debug_logfile'],
'level': 'DEBUG',
},
'debug.contract': { ## duplicate code
'handlers': ['contract_debug_logfile'],
'level': 'DEBUG',
'propagate': True,
}
},
##---snip---##
那么在我的代码中我必须这样做:
info_logger = logging.getLogger('info.contract')
debug_logger = logging.getLogger('debug.contract')
info_logger.info("Some info message...")
debug_logger.debug("Some debug message...")
这意味着有必要为我需要使用的每个日志级别实例化一个新的记录器对象。这看起来很麻烦,而且可能效率低下。
我的问题是:
有没有办法让一个记录器管理所有日志级别?换句话说,是否可以执行以下操作:
some_multilevel_logger = logging.getLogger('some_multilevel_logger')
some_multilevel_logger.info("Some info message...")
some_multilevel_logger.debug("Some debug message...")
这将产生与之前的 sn-p 相同的结果,其中定义了 2 个记录器。
如果这种行为是不可能的,那么为每个日志级别创建一个记录器是否被认为是不好的做法?具有多个日志级别的大型项目呢?
谢谢!
【问题讨论】: