Databricks Wheel任务中Python日志无法显示的问题求助
Databricks Wheel任务日志不显示问题排查与解决
问题场景
将Python包打包为Wheel并在Databricks Job中运行时,仅print语句的输出能显示在任务Output区域,logging.info和自定义logger的日志均无法正常输出。测试代码如下:
# __init__.py import logging from log_utils import setup_logging def entrypoint(): logger = setup_logging(level=logging.DEBUG) logging.info("logging.info - foo") logger.info("logger.info - bar") print("print - baz")
期望输出:
logging.info - foo logger.info - bar print - baz
实际输出:
print - baz
问题原因
- Databricks Job环境中Python root logger的默认配置被修改,导致日志无法输出到标准输出;
- 自定义日志工具未处理重复添加Handler的情况,可能引发日志输出异常;
- 直接调用
logging.info使用的是root logger,若其级别未正确同步设置,日志会被过滤。
解决方案
调整日志工具配置
修改log_utils.py,确保root logger级别正确设置,同时避免重复添加Handler:
# log_utils.py import sys import logging from typing import Optional def setup_logging( name: Optional[str] = None, level: Optional[int] = None ) -> logging.Logger: if level is None: level = logging.INFO logger = logging.getLogger(name) logger.setLevel(level) # 避免重复添加Handler,防止日志重复输出或异常 if not logger.handlers: # 降低py4j日志级别,减少冗余输出 logging.getLogger("py4j.clientserver").setLevel(logging.WARNING) handler = logging.StreamHandler(sys.stdout) handler.setLevel(level) fmt = "%(levelname)s - %(asctime)s - %(message)s" datefmt = "%Y-%m-%d %H:%M:%S" formatter = logging.Formatter(fmt=fmt, datefmt=datefmt) handler.setFormatter(formatter) logger.addHandler(handler) # 同步设置root logger级别(当使用root logger时) if name is None: logging.root.setLevel(level) return logger
统一日志输出方式
在入口文件中统一使用自定义logger输出日志,避免直接调用logging.info(后者依赖root logger配置):
# __init__.py import logging from log_utils import setup_logging def entrypoint(): logger = setup_logging(level=logging.DEBUG) # 使用自定义logger输出所有日志 logger.info("logging.info - foo") logger.info("logger.info - bar") print("print - baz")
效果验证
修改完成后重新打包Wheel并运行Databricks Job,所有日志内容将正常显示在任务Output区域,符合预期输出。
内容的提问来源于stack exchange,提问作者Giacomo Sachs
相关产品推荐
相关产品推荐

