PySpark日志器无法记录INFO语句?如何配置使其正常输出?
解决PySpark中自定义日志器INFO级别不输出的问题
问题现象
配置名为Example Processor的日志器级别为INFO时,仅能看到WARN、ERROR和FATAL级别的日志;但设置为DEBUG级别时,能正常输出DEBUG、INFO、WARN、ERROR和FATAL所有级别日志。
原代码示例
self.spark = SparkSession.builder \ .master("local[1]") \ .appName("DemoProcessor") \ .getOrCreate() log4jLogger = self.spark.sparkContext._jvm.org.apache.log4j self.log = log4jLogger.LogManager.getLogger('Example Processor') self.log.setLevel(log4jLogger.Level.INFO) # self.log.setLevel(log4jLogger.Level.DEBUG) self.log.trace("Trace Message!") self.log.debug("Debug Message!") self.log.info("Info Message!") self.log.warn("Warn Message!") self.log.error("Error Message!") self.log.fatal("Fatal Message!")
原因分析
Spark默认的根日志级别为WARN,即使自定义日志器单独设置了INFO级别,根日志器的过滤规则会拦截INFO及以下级别的日志。而当自定义日志器设置为DEBUG时,日志框架会优先遵循子日志器的细粒度级别规则,从而绕过根日志的WARN级别限制。
解决方法
需要同时调整自定义日志器级别和Spark全局根日志级别,修改后的代码如下:
self.spark = SparkSession.builder \ .master("local[1]") \ .appName("DemoProcessor") \ .getOrCreate() log4jLogger = self.spark.sparkContext._jvm.org.apache.log4j # 获取自定义日志器并设置级别为INFO self.log = log4jLogger.LogManager.getLogger('Example Processor') self.log.setLevel(log4jLogger.Level.INFO) # 方法1:直接修改根日志器级别为INFO root_logger = log4jLogger.LogManager.getRootLogger() root_logger.setLevel(log4jLogger.Level.INFO) # 方法2:使用SparkContext的API修改全局日志级别,效果与方法1一致 # self.spark.sparkContext.setLogLevel("INFO") self.log.trace("Trace Message!") self.log.debug("Debug Message!") self.log.info("Info Message!") self.log.warn("Warn Message!") self.log.error("Error Message!") self.log.fatal("Fatal Message!")
修改后效果
执行代码后,Example Processor的INFO级别日志会正常输出,同时保留WARN、ERROR、FATAL级别的日志内容。
内容的提问来源于stack exchange,提问作者mikey8989
相关产品推荐
相关产品推荐

