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

Python如何让不同函数及模块的print输出写入同一个日志文件

问题原因

你当前将stdout重定向到日志文件的逻辑封装在some_big_function内部,函数执行结束后你主动将sys.stdout恢复为原始的控制台输出对象,因此main函数中在some_big_function调用前后的print语句,都会输出到控制台而非指定日志文件。

解决方案

方案1:保留print写法,全局统一重定向

将重定向逻辑放到脚本入口最外层,覆盖整个程序运行周期,无需修改原有函数内的print代码,改动量最小:

import sys
from contextlib import redirect_stdout

# 其他模块导入写在最前面
import classes from other .py scripts

def some_big_function(args):
    # 直接写print即可,不需要额外加重定向逻辑
    print("some log from some_big_function")

def main():
    print("some log from main before calling some_big_function")
    some_big_function(args)
    print("some log from main after calling some_big_function")

if __name__ == "__main__":
    # 全局重定向所有print输出到日志文件,上下文管理器会自动处理文件关闭和stdout恢复
    with open("message.log", "w", encoding="utf-8") as log_file, redirect_stdout(log_file):
        main()

方案2:改用Python标准logging模块(正式项目更推荐)

print原生不支持复杂日志管理,使用内置logging模块只需全局配置一次,跨模块、跨函数的日志都会统一输出到指定路径,还支持日志分级、格式自定义、多端输出等能力:

import logging

# 其他模块导入写在最前面
import classes from other .py scripts

# 全局一次性配置logging,后续所有调用自动生效
logging.basicConfig(
    filename="message.log",
    level=logging.INFO,
    format="%(asctime)s - %(message)s",
    encoding="utf-8"
)

def some_big_function(args):
    # 将原有print替换为logging.info即可
    logging.info("some log from some_big_function")

def main():
    logging.info("some log from main before calling some_big_function")
    some_big_function(args)
    logging.info("some log from main after calling some_big_function")

if __name__ == "__main__":
    main()

内容的提问来源于stack exchange,提问作者Chuck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 08:15:02