如何在运行时过滤指定类的日志输出?
如何在运行时过滤指定类的日志输出?
嘿,我来帮你解决这个问题!你当前的代码没起作用,核心原因是你把过滤器加到了bar.py自己的logger上,但Foo类里的日志器属于foo这个命名空间,两者完全独立,所以你的过滤规则根本没作用到目标日志上。另外还有个小细节要修正:logging.basicConfig(level=logging.Info)里的Info得改成大写的INFO,不然会触发属性错误。
下面给你两种实用的解决思路:
方法一:直接针对Foo的日志器添加过滤
既然Foo用的是foo命名空间的日志器,那我们直接拿到这个日志器,给它加上过滤规则就行。如果想完全屏蔽Foo的日志,可以写一个拒绝所有日志的过滤器:
# bar.py import logging from foo import Foo # 修正大小写错误 logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) logger.addFilter(logging.Filter(__name__)) # 获取Foo类使用的日志器 foo_logger = logging.getLogger('foo') # 定义一个过滤器:拒绝所有日志记录 class BlockAllFilter(logging.Filter): def filter(self, record): return False # 返回False表示丢弃这条日志 foo_logger.addFilter(BlockAllFilter()) logger.info("Started script") foo = Foo() # 这里的Init successful日志会被过滤掉
方法二:给根日志器加全局过滤(更灵活)
如果想更灵活地控制(比如只过滤特定模块/类的日志,其他保留),可以给根日志器添加过滤器,通过检查日志记录的name属性来判断是否过滤:
# bar.py import logging from foo import Foo logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) logger.addFilter(logging.Filter(__name__)) # 定义过滤器:拒绝来自foo命名空间的日志 class FilterFooLogs(logging.Filter): def filter(self, record): # 返回True表示保留日志,False表示丢弃 return record.name != 'foo' # 给根日志器添加过滤器,所有子日志器都会继承这个规则 root_logger = logging.getLogger() root_logger.addFilter(FilterFooLogs()) logger.info("Started script") # 这条会正常输出 foo = Foo() # 这条日志会被过滤
简单总结下Python日志系统的逻辑:每个日志器是按命名空间独立存在的,子日志器会继承父日志器的过滤规则,但同级日志器之间互不影响。你之前操作的是bar日志器,自然管不到foo日志器啦~
备注:内容来源于stack exchange,提问作者probablyjg
相关产品推荐
相关产品推荐

