在Databricks中使用logging模块出现多余py4j.java_gateway日志如何解决
Databricks Python logging冗余日志过滤方案
问题原因
你在调用logging.basicConfig时将全局根日志的级别设置为了INFO,Databricks底层用于Python和Java交互的py4j模块的日志默认继承根日志级别,因此会输出大量INFO级别的运行日志,占满你的输出窗口。
解决方案
方案1:直接调高py4j模块的日志级别
最简单的处理方式是在初始化日志配置时,单独将py4j相关的日志级别调整为WARN或更高,只保留你自己输出的INFO级日志:
import logging def initialize_logging(log_level) -> logging: logging.basicConfig( format='%(asctime)s,%(msecs)03d %(levelname)-8s %(name)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S', level=log_level ) # 新增以下行,将py4j的日志级别调高到WARN,过滤INFO级别的冗余输出 logging.getLogger("py4j.java_gateway").setLevel(logging.WARN) initialize_logging(logging.INFO) logging.info("some message")
方案2:自定义专属Logger(更推荐)
如果不想修改全局日志配置影响其他模块,可以创建独立的专属Logger,单独配置格式和级别,完全隔离第三方模块的日志输出:
import logging def initialize_logging(log_level): # 创建专属logger,避免使用根logger logger = logging.getLogger("my_custom_logger") # 关闭继承根logger的配置,避免被全局配置影响 logger.propagate = False logger.setLevel(log_level) # 自定义日志格式 formatter = logging.Formatter( fmt='%(asctime)s,%(msecs)03d %(levelname)-8s %(name)s %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) # 添加控制台处理器 console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) logger.addHandler(console_handler) return logger # 初始化自己的logger logger = initialize_logging(logging.INFO) logger.info("some message")
用这个方案你输出的所有日志都会归属于my_custom_logger,不会触发其他模块的日志输出,也不会收到第三方模块的冗余日志。
内容的提问来源于stack exchange,提问作者Borislav Blagoev
相关产品推荐
相关产品推荐

