如何在Python logging中移除指定logger对象以屏蔽Elasticsearch日志
屏蔽Elasticsearch日志的解决方案
问题描述
我想屏蔽输出中所有Elasticsearch日志,保留代码内其他日志。曾尝试将Elasticsearch日志级别设置为WARNING,但未生效。希望通过类似logging.deleteLogger("logger对象名称")的方式移除特定logger,消除输出中的POST状态消息,原代码示例如下:
import logging import os path = os.getcwd() file_path = os.path.join(path, "operations.log") tracer = logging.getLogger('elasticsearch') tracer.setLevel(logging.WARNING) logging.basicConfig(level=logging.INFO, encoding="utf-8", format="%(asctime)s: %(levelname)s: %(message)s", handlers=[logging.FileHandler(file_path), logging.StreamHandler()])
解决方法
Python的logging模块没有deleteLogger方法,但可以通过以下方式彻底屏蔽Elasticsearch日志:
1. 直接禁用主Elasticsearch Logger
通过设置极高日志级别、关闭日志传播并添加空处理器,彻底阻断其输出:
import logging import os path = os.getcwd() file_path = os.path.join(path, "operations.log") # 处理Elasticsearch日志 es_logger = logging.getLogger('elasticsearch') es_logger.setLevel(logging.CRITICAL + 1) # 级别高于所有日志等级,彻底屏蔽 es_logger.propagate = False # 禁止日志传递给根Logger es_logger.addHandler(logging.NullHandler()) # 避免触发无处理器警告 # 配置全局日志 logging.basicConfig(level=logging.INFO, encoding="utf-8", format="%(asctime)s: %(levelname)s: %(message)s", handlers=[logging.FileHandler(file_path), logging.StreamHandler()])
2. 批量处理Elasticsearch子Logger
如果Elasticsearch日志来自子Logger(如elasticsearch.connection),可以批量处理所有相关Logger:
# 遍历并屏蔽所有elasticsearch前缀的Logger for logger_name in logging.Logger.manager.loggerDict: if logger_name.startswith('elasticsearch'): sub_logger = logging.getLogger(logger_name) sub_logger.setLevel(logging.CRITICAL + 1) sub_logger.propagate = False sub_logger.addHandler(logging.NullHandler())
3. 原方案失效原因
之前设置WARNING级别无效,大概率是因为Elasticsearch Logger默认会将日志传播到根Logger,而根Logger的级别是INFO,导致符合根Logger级别的日志依然会被输出。关闭传播+设置超高级别,才能彻底阻断其日志流。
内容的提问来源于stack exchange,提问作者Rumi
相关产品推荐
相关产品推荐

