You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 23:18:26