无需重启iPython,如何重置以消除日志重复问题?
不用重启IPython也能解决日志重复输出的问题
我之前在IPython里反复运行脚本时也碰到过这个糟心的日志重复问题——每次%run main.py,日志就多打一遍,非要重启IPython才行确实麻烦。结合你的情况,给你几个不用重启就能解决的办法:
临时修复:手动清空Logger的Handlers
如果只是想快速重置当前的logger,直接在IPython控制台里跑这段代码就行:
import logging # 如果你用的是root logger,就直接用logging.getLogger() target_logger = logging.getLogger("你的日志器名称") # 替换成你代码里实际用的logger名 # 循环移除所有已添加的handler while target_logger.handlers: target_logger.handlers.pop()
执行完再%run main.py,日志就不会重复了。原理很简单:每次运行脚本时你都给logger加了新的handler,而IPython进程没重启,这些handler会一直累积,清空后就只剩新运行脚本添加的那一个了。
从根源解决:让代码自动避免重复添加Handler
上面的临时办法每次都要手动执行,更省心的是修改你的main.py代码,让它只在第一次运行时添加handler:
import logging def init_logger(): logger = logging.getLogger("my_app_logger") # 关键判断:只有当logger没有handler的时候才添加 if not logger.handlers: stream_handler = logging.StreamHandler() log_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') stream_handler.setFormatter(log_formatter) logger.addHandler(stream_handler) logger.setLevel(logging.INFO) return logger # 初始化日志器 logger = init_logger() logger.info("这是一条测试日志")
这样不管你在IPython里%run多少次,都只会添加一次handler,自然不会出现重复日志的情况。
为什么你的之前的尝试没用?
%reset:这个命令只会清理你在IPython命名空间里定义的变量,而logger实例是存在logging模块的全局空间里的,所以根本碰不到它,自然没用。CTRL-.:这个是中断当前正在运行的代码,和重置logger完全不搭边,当然解决不了问题。- 调用IPython相关代码报错:大概率是你误操作了IPython内部的API,其实根本不需要碰IPython的内部对象,直接操作
logging模块的logger就足够了。
内容的提问来源于stack exchange,提问作者xtian
相关产品推荐
相关产品推荐

