Python如何将控制台输出及错误信息重定向到日志文件
Python控制台输出+异常信息统一写入日志解决方案
Python的控制台输出分为两个独立流:sys.stdout 负责普通输出(如print语句内容),sys.stderr 负责异常栈、报错信息输出。你已经完成了stdout的重定向,只需同步将stderr指向同一个日志文件即可满足需求。
基础版实现(仅写入日志文件)
import sys import os # 提前创建日志目录,避免路径不存在报错 os.makedirs(r'mydir', exist_ok=True) # 打开日志文件:w模式覆盖上次日志,a模式追加历史日志,buffering=1为行缓冲避免日志丢失 log_file = open(r'mydir\Log.txt', 'w', encoding='utf-8', buffering=1) # 同时重定向普通输出和错误输出 sys.stdout = log_file sys.stderr = log_file # 下方写你的业务代码即可,所有print、报错都会写入日志
注意事项
- 如需保留每次运行的历史日志,将打开模式从
w改为a即可 buffering=1配置为行缓冲,每输出一行就同步写入磁盘,避免程序意外崩溃时内存中的日志未落盘- 指定
encoding='utf-8'避免日志中出现中文乱码
进阶版实现(同时输出到控制台+日志文件)
如果调试阶段需要实时查看输出,同时保留日志文件,可以自定义双流类同时输出到两个终端:
import sys import os class DualOutput: def __init__(self, file, console): self.file = file self.console = console def write(self, content): self.file.write(content) self.console.write(content) def flush(self): self.file.flush() self.console.flush() os.makedirs(r'mydir', exist_ok=True) log_file = open(r'mydir\Log.txt', 'w', encoding='utf-8', buffering=1) sys.stdout = DualOutput(log_file, sys.__stdout__) sys.stderr = DualOutput(log_file, sys.__stderr__)
全局异常兜底补充
为了极端场景下也能完整捕获异常栈,可在业务代码外层加全局捕获逻辑:
if __name__ == "__main__": try: # 替换为你的业务入口函数 your_main_function() except Exception as e: import traceback # 主动打印异常栈,确保完整报错信息写入日志 traceback.print_exc() # 可选:保留原异常退出逻辑,不影响程序原有行为 raise e
内容的提问来源于stack exchange,提问作者smitty_werben_jagerm
相关产品推荐
相关产品推荐

