Foundry代码仓库中如何配置Python日志输出至独立日志文件
Foundry PySpark 自定义独立日志文件配置方案
结论先行:完全支持配置独立Python logging handler写入自定义日志文件,不需要修改平台默认日志配置。
实现前提说明
Foundry PySpark Transforms运行环境对文件系统路径有权限限制:
- 写入临时路径(如
/tmp目录):仅本次构建的Driver节点可访问,任务结束后随容器销毁自动清理,适合临时调试 - 写入输出数据集的存储路径:日志会随数据集一起持久化保存,可直接在数据集文件列表中访问,是生产场景推荐的方案
注意:不要直接修改平台内置的PySpark root logger配置,否则会破坏原生日志链路,导致默认的数据集日志、Driver日志丢失记录。自定义日志请使用独立声明的logger实例。
可直接复用的实现代码
from transforms.api import transform, Input, Output import logging import os from logging.handlers import RotatingFileHandler # 初始化独立自定义logger,不要复用平台默认的内置logger custom_logger = logging.getLogger("custom_pipeline_logger") custom_logger.setLevel(logging.INFO) # 关闭日志向上传递,避免自定义日志混入默认Driver日志 custom_logger.propagate = False @transform( final_output=Output("/path/to/your/target/dataset"), source_data=Input("/path/to/your/source/dataset") ) def pipeline_compute(source_data, final_output): # 获取输出数据集的底层存储路径,日志存在该路径下会随数据集持久化 output_base_path = final_output.filesystem().hadoop_path custom_log_dir = os.path.join(output_base_path, "pipeline_runtime_logs") os.makedirs(custom_log_dir, exist_ok=True) log_save_path = os.path.join(custom_log_dir, "runtime_exec.log") # 配置滚动文件handler,避免单日志文件过大 file_handler = RotatingFileHandler( filename=log_save_path, maxBytes=10 * 1024 * 1024, # 单文件最大10MB自动滚动 backupCount=3, # 最多保留3份历史滚动日志 encoding="utf-8" ) # 自定义日志输出格式 file_handler.setFormatter(logging.Formatter( "%(asctime)s | %(levelname)s | %(module)s.%(funcName)s | %(message)s" )) # 避免重复添加handler导致日志重复写入 if not custom_logger.handlers: custom_logger.addHandler(file_handler) try: spark = source_data.dataframe().sparkSession source_df = source_data.dataframe() custom_logger.info(f"任务启动,源数据集总记录数:{source_df.count()}") # 此处编写你的业务处理逻辑 processed_df = source_df.dropna(subset=["primary_key"]) custom_logger.info(f"数据清洗完成,有效记录数:{processed_df.count()}") final_output.write_dataframe(processed_df) custom_logger.info("任务执行完成,数据已成功写入输出数据集") finally: # 任务结束前释放文件句柄,避免日志写入不完整 file_handler.close() custom_logger.removeHandler(file_handler)
自定义日志查看方式
配置完成后,持久化到输出数据集的自定义日志可直接通过以下路径访问:
- 进入对应输出数据集的详情页
- 切换到「文件」标签页
- 找到
pipeline_runtime_logs目录,下载对应log文件即可查看,不需要检索Driver日志
常见注意事项
- 不要给自定义logger添加绑定
stdout/stderr的StreamHandler,否则自定义日志还是会被采集到Driver日志流中,和平台默认日志混排 - 单任务自定义日志总大小建议控制在100MB以内,避免占用过多数据集存储配额
- 如果是在Executor端运行的UDF、Pandas UDF逻辑中写日志,注意Executor节点文件系统是隔离的,这部分日志不会自动汇总到Driver端生成的日志文件中,如需收集全量Executor侧日志,需要额外开发日志归集逻辑,调试场景建议直接使用平台默认logger记录。
内容的提问来源于stack exchange,提问作者CheTesta
相关产品推荐
相关产品推荐

