如何避免Django在shell中输出多条重复日志
Django日志重复输出问题解决方案
核心原因
你编写的日志初始化逻辑(创建logger、设置日志级别、添加StreamHandler的代码)每被执行一次,就会给名为LoggingTest的logger新增一个独立的StreamHandler实例,每个Handler都会单独处理一次日志输出,初始化代码被执行多少次就会输出多少条重复日志。Django项目中如果这段初始化代码写在模块顶层、可被重复调用的函数/视图内,就会触发该问题。
另外如果没有关闭logger的向上传递属性,日志也会被父logger(如root logger)的Handler处理,额外产生重复输出。
修复方案
- 方案1:在日志初始化代码中增加判断逻辑,避免重复添加Handler
修改你的日志初始化代码如下即可:
import logging logger = logging.getLogger('LoggingTest') logger.setLevel(20) # 仅当logger无任何Handler时才新增Handler if not logger.handlers: sh = logging.StreamHandler() logger.addHandler(sh) # 关闭日志向上传递,避免父logger重复输出 logger.propagate = False
- 方案2:使用Django原生统一日志配置(更推荐)
不要在业务代码中零散初始化日志Handler,直接在项目的settings.py中全局配置日志:
# settings.py 新增如下配置 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'loggers': { 'LoggingTest': { 'handlers': ['console'], 'level': 'INFO', # 对应你设置的级别20 'propagate': False, }, }, }
后续业务代码直接调用logger即可,无需再做初始化操作:
import logging logger = logging.getLogger('LoggingTest') # 你的业务逻辑 si_ids = Blank_Form.objects.get(blank_form_id__exact=blank_form_id).core_service_id.split('s')[1::] logger.info('[si_ids] {}'.format(si_ids))
内容的提问来源于stack exchange,提问作者araya
相关产品推荐
相关产品推荐

