工具函数既可能 python app.py 单独跑,也可能被调度器/其他脚本 import。把 logger 做成可选参数最省事。

推荐结构

import logging

def setup_logging() -> logging.Logger:
    logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s: %(message)s")
    return logging.getLogger("MainScriptLogger")

def main(logger: logging.Logger | None = None) -> None:
    if logger is None:
        logger = logging.getLogger("MainScriptLogger")
        if not logger.handlers:
            logger = setup_logging()
    logger.info("脚本开始执行")
    try:
        ...
        logger.info("脚本执行完成")
    except Exception:
        logger.exception("脚本执行失败")
        raise

if __name__ == "__main__":
    main(setup_logging())

好处

  • 被 import 时不强迫写日志到本地文件
  • 独立运行时仍有完整日志
  • 调度方可以注入带任务 ID 的 logger,便于串联链路