如何将PySpark日志输出到文件(RollingFileAppender配置报错)
问题说明
运行环境:Python 3.7 + PySpark 2.4.7
需求:将PySpark运行产生的日志输出到指定文件
最初实现思路是通过Spark上下文获取JVM的Log4j根日志对象,再通过pyjnius创建RollingFileAppender实例绑定到日志对象上,代码运行时抛出如下错误:
File "*****/lib/python3.7/site-packages/py4j/java_gateway.py", line 1218, in _build_args [get_command_part(arg, self.pool) for arg in new_args]) File "*****/lib/python3.7/site-packages/py4j/java_gateway.py", line 1218, in <listcomp> [get_command_part(arg, self.pool) for arg in new_args]) File "*****/lib/python3.7/site-packages/py4j/protocol.py", line 298, in get_command_part command_part = REFERENCE_TYPE + parameter._get_object_id() AttributeError: 'org.apache.log4j.RollingFileAppender' object has no attribute '_get_object_id'
报错核心原因:pyjnius创建的Java对象和PySpark内置Py4J网关维护的Java对象体系不兼容,Py4J调用Java方法时仅识别自身网关生成的、携带_get_object_id属性的对象实例,pyjnius生成的对象没有该标识,因此传参时直接抛出属性错误。
稳定实现方案
不需要引入pyjnius等第三方依赖,直接通过Spark上下文内置的Py4J JVM入口加载所有Log4j相关类即可,生成的对象天然兼容Py4J调用规则,可稳定运行。
完整实现代码如下:
# 初始化Spark会话 from pyspark.sql import SparkSession spark = SparkSession.builder.appName("spark_log_to_file").getOrCreate() sc = spark.sparkContext # 获取Log4j入口 log4j = sc._jvm.org.apache.log4j root_logger = log4j.LogManager.getRootLogger() # 按需设置日志级别 root_logger.setLevel(log4j.Level.INFO) # 初始化滚动文件追加器和日志格式布局 file_appender = log4j.RollingFileAppender() layout = log4j.PatternLayout() # 自定义日志输出格式 layout.setConversionPattern("%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n") # 配置日志文件参数 log_path = "/your/absolute/log/path/spark_runtime.log" # 替换为实际日志文件绝对路径 file_appender.setFile(log_path) file_appender.setLayout(layout) # 配置滚动规则:单文件最大10MB,最多保留5个历史备份 file_appender.setMaxFileSize("10MB") file_appender.setMaxBackupIndex(5) # 激活追加器配置 file_appender.activateOptions() # 将文件追加器绑定到根日志对象 root_logger.addAppender(file_appender) # 测试日志输出 root_logger.info("日志写入测试:该内容将同时输出到控制台和指定日志文件")
注意事项
- 日志路径必须使用绝对路径,且启动Spark任务的系统用户对该路径持有读写权限,否则会出现写入失败问题
- 若不需要日志同步输出到控制台,可先枚举根日志对象上已绑定的所有追加器,找到控制台追加器后调用
removeAppender方法移除即可 - 该方案无额外第三方依赖,完全基于Spark原生运行时组件实现,在PySpark 2.4.x系列版本上可稳定运行
内容的提问来源于stack exchange,提问作者SamuelNLP
相关产品推荐
相关产品推荐

