重置 python Logger 以防止重复的日志记录
Reset python Logger to prevent duplicate logging records
上下文
在一个包含多个 classes 和方法的模块中,我使用 python 日志记录 class 和一个名为 logger
的全局变量。一旦模块被调用,它就会被方法initialise_logger
(见下文)初始化。
问题
当我从 Spyder 多次执行该模块时,记录器会为每个记录器消息创建多个日志记录,即在第一个 运行 之后打印一次消息“xyz”,在第二个 运行 它被打印了两次等等。当我关闭 Spyder 并再次打开它时,模块的第一个 运行 再次以一条打印消息开始。
我试过的
- 我试图通过检查是否已经存在具有相同名称的记录器 (following this post) 来跳过记录器的初始化 (
initialise_logger
)。这失败了,因为在 I 运行 initialise_logger
. 之前确实不存在具有指定名称的记录器
- 我还尝试在 运行ning
initialise_logger
之前“弹出”所有可用的处理程序 (following this seggestion),但是在 运行ning [=] 之前找不到任何处理程序13=].
我的代码
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,日志文件就无法删除。这个问题也通过我上面的方法解决了
上下文
在一个包含多个 classes 和方法的模块中,我使用 python 日志记录 class 和一个名为 logger
的全局变量。一旦模块被调用,它就会被方法initialise_logger
(见下文)初始化。
问题
当我从 Spyder 多次执行该模块时,记录器会为每个记录器消息创建多个日志记录,即在第一个 运行 之后打印一次消息“xyz”,在第二个 运行 它被打印了两次等等。当我关闭 Spyder 并再次打开它时,模块的第一个 运行 再次以一条打印消息开始。
我试过的
- 我试图通过检查是否已经存在具有相同名称的记录器 (following this post) 来跳过记录器的初始化 (
initialise_logger
)。这失败了,因为在 I 运行initialise_logger
. 之前确实不存在具有指定名称的记录器
- 我还尝试在 运行ning
initialise_logger
之前“弹出”所有可用的处理程序 (following this seggestion),但是在 运行ning [=] 之前找不到任何处理程序13=].
我的代码
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])
这个问题