Python logging过滤器仅对控制台生效,过滤内容仍写入日志文件的问题求助
Python logging过滤器仅对控制台生效,过滤内容仍写入日志文件的问题求助
嗨,我看了你的代码,问题很明确——你只把过滤器加到了控制台的StreamHandler上,而通过logging.basicConfig自动创建的文件Handler并没有应用这个过滤规则,所以被过滤的日志还是会写入文件里!
这里有两种简单的解决办法:
办法一:给根Logger添加过滤器(推荐)
根Logger的过滤器会被所有关联它的Handler继承,这样不管是文件输出还是控制台输出,都会统一遵守过滤规则,不用分别给每个Handler加过滤器。
修改后的代码如下:
import logging class applyFilter(logging.Filter): def filter(self, record): return not record.getMessage().startswith('Hello') logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', filename='log_file.txt', filemode='a') # 给根Logger添加过滤器,所有Handler都会生效 logging.getLogger('').addFilter(applyFilter()) console = logging.StreamHandler() console.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') console.setFormatter(formatter) logging.getLogger('').addHandler(console) logging.info('Hello world')
办法二:给文件Handler单独添加过滤器
如果你只想给特定的Handler加过滤器,可以手动从根Logger的handlers列表里找到文件Handler,再给它添加过滤器。不过这种方式不如第一种简洁:
import logging class applyFilter(logging.Filter): def filter(self, record): return not record.getMessage().startswith('Hello') logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', filename='log_file.txt', filemode='a') # 获取根Logger的文件Handler并添加过滤器 root_logger = logging.getLogger('') for handler in root_logger.handlers: if isinstance(handler, logging.FileHandler): handler.addFilter(applyFilter()) console = logging.StreamHandler() console.addFilter(applyFilter()) console.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') console.setFormatter(formatter) root_logger.addHandler(console) logging.info('Hello world')
现在运行代码,你会发现Hello world既不会出现在控制台,也不会写入log_file.txt里啦!
备注:内容来源于stack exchange,提问作者jabroni
相关产品推荐
相关产品推荐

