PySpark开发环境下log4j2.properties日志配置及格式文档咨询
PySpark log4j2 日志配置解决方案
问题核心
在Ubuntu开发环境中使用PySpark结合pytest测试,通过SparkSession.builder.getOrCreate()创建会话时,代码中info级别的日志无法输出,需实现以下需求:
- 统一设置所有
My.*日志记录器的级别 - 日志同时输出到控制台和文件
- 获取
%t、%m、%n、%d{YYYY-MM-DD}等格式符的官方说明
之前尝试log4j 1.2的配置语法报错ConfigurationException: No type attribute provided for Appender my_console,找不到适配log4j2的有效配置指导。
有效log4j2.properties配置示例
Spark 3.x及以上版本默认使用log4j2,需采用其专属配置语法,以下是满足需求的完整配置:
# 根日志级别配置 rootLogger.level = INFO # 配置My.*命名空间的日志规则 logger.my.name = My logger.my.level = INFO logger.my.additivity = false logger.my.appenderRefs = console, file logger.my.appenderRef.console.ref = ConsoleAppender logger.my.appenderRef.file.ref = FileAppender # 控制台追加器配置 appender.console.type = Console appender.console.name = ConsoleAppender appender.console.layout.type = PatternLayout appender.console.layout.pattern = %d{YYYY-MM-DD HH:mm:ss} [%t] %-5level %logger{36} - %m%n # 文件追加器配置(指定输出路径) appender.file.type = File appender.file.name = FileAppender appender.file.fileName = ./spark_app.log appender.file.layout.type = PatternLayout appender.file.layout.pattern = %d{YYYY-MM-DD HH:mm:ss} [%t] %-5level %logger{36} - %m%n
配置生效方式
- 将上述内容保存为
log4j2.properties文件 - 启动测试前通过环境变量指定配置路径:
export PYSPARK_SUBMIT_ARGS="--driver-java-options '-Dlog4j.configurationFile=file:///绝对路径/log4j2.properties' pyspark-shell" pytest test_my_spark_module.py
或在Python代码开头添加(需在创建SparkSession前执行):
import os os.environ['PYSPARK_SUBMIT_ARGS'] = "--driver-java-options '-Dlog4j.configurationFile=file:///绝对路径/log4j2.properties' pyspark-shell"
日志格式符说明
你提到的格式符具体含义:
%t:当前线程名称%m:日志消息内容%n:换行符%d{YYYY-MM-DD}:日志记录的日期(可扩展为%d{YYYY-MM-DD HH:mm:ss}包含时分秒)
补充常用格式符:%-5level:日志级别左对齐,占5字符宽度(如INFO、DEBUG)%logger{36}:日志记录器名称,最多显示36个字符
代码适配建议
你的代码中使用的是log4j 1.x的API,在log4j2环境下虽兼容,但建议切换为log4j2 API以避免潜在问题:
# 替换原日志获取代码 self.log = spark.sparkContext._jvm.org.apache.logging.log4j.LogManager.getLogger('My.SparkModule')
验证
运行测试后,控制台会输出My.*的info日志,同时指定的spark_app.log文件中也会同步生成日志内容。
内容的提问来源于stack exchange,提问作者Kashyap
相关产品推荐
相关产品推荐

