python-3.x - 重置 python Logger 以防止重复的日志记录
问题描述
语境
在具有多个类和方法的模块中,我使用带有全局变量的 python 日志记录类,称为logger
. initialise_logger
一旦调用模块,它就会由方法初始化(见下文)。
问题
当我从 Spyder 多次执行该模块时,记录器会为每个记录器消息创建多个记录记录,即在第一次运行后,会打印一次消息“xyz”,在第二次运行后会打印两次,依此类推。当我关闭时Spyder 并再次打开它,模块的第一次运行再次以一条打印消息开始。
我试过的
- 我试图
initialise_logger
通过检查是否已经存在同名的记录器来跳过记录器()的初始化(在这篇文章之后)。这失败了,因为在我运行之前具有指定名称的记录器确实不存在initialise_logger
。 - 我还尝试在运行之前“弹出”所有可用的处理程序(在此 seggestion 之后)
initialise_logger
,但在运行之前找不到处理程序initialise_logger
。
我的代码
def initialise_logger():
global logger
logger = logging.getLogger("reader")
logger.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
file_handler = logging.FileHandler("mylogfile.log")
file_handler.setLevel(logging.DEBUG)
logger.addHandler(console_handler)
logger.addHandler(file_handler)
解决方案
解决了它:
我创建了一个destroy_logger
在整个过程结束时触发的新方法。它关闭并删除所有处理程序。这是方法内部的内容:
def destroy_logger():
global logger
while logger.hasHandlers():
logger.handlers[0].close
logger.removeHandler(logger.handlers[0])
这个问题在这里帮助我解决了它。它还提到了我也注意到的一个问题:只要打开 IDE,就无法删除日志文件。我上面的方法也解决了这个问题。
推荐阅读
- google-apps-script - 使用谷歌应用程序脚本将范围添加到辅助(右)垂直轴上的折线图
- r - 解决 R 中的中级微观经济学问题
- python-3.x - 将项目附加到列表的元素,将其添加到 Python 中列表中的所有元素?
- python-3.x - /usr/bin/ld: 找不到 -lcodec2 安装 pycodec2 时出错
- r - 禁用 actionButton 直到选择了一组新的选项
- javascript - 计时器用完后重定向到主页
- python - flask python 3 TypeError(“'NoneType'对象不可下标”
- assembly - 装配编程输入+5
- javascript - 在无线电类型字段上同时提供 :value 和 v-model
- java - 我可以只创建一个处理整个应用程序的活动吗?