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
相关产品推荐
相关产品推荐

