终于准备从pycharm切换到vscode了。我正在努力让它尽可能无痛。为此,我安装了 ipython 扩展,它在与 pycharm 最相似的窗口中运行代码。
我在启动的时候遇到了一个问题:
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
handler_format = logging.Formatter(
fmt='[%(asctime)s: %(levelname)s] %(message)s')
handler.setFormatter(handler_format)
logger.addHandler(handler)
logger.debug('debug information')
控制台显示如下:
In [1]: %run "/Python/project/one.py"
[2024-11-12 06:42:21,680: DEBUG] debug information
这里没有问题,但是如果再次运行代码,输出将如下:
In [2]: %run "/Python/project/one.py"
[2024-11-12 06:44:20,336: DEBUG] debug information
[2024-11-12 06:44:20,336: DEBUG] debug information
输出似乎是重复的。仅当将日志输出到控制台时才会发生这种情况。我在网上看了很多资料,都没有出现这样的问题。
打开 IPython %run文档并阅读以下段落:
但执行后,IPython 交互式命名空间将使用程序中定义的所有变量进行更新(除了
__name__
和sys.argv
)。打开Logger文档并阅读以下段落:
这里唯一有趣的是:对具有给定名称的函数的所有调用都会返回相同的日志记录实例。
logging.getLogger(name)
由此我们可以得出2个结论:
因此问题来了!我们调用先前创建的同一个记录器并向其添加另一个处理程序。
因此,在添加处理程序之前,您可以执行以下两项操作之一:
但文档指出handlers属性对于记录器来说是“只读”的
clear()
,直接修改此属性(通过调用)可能不是一个安全的解决方案,特别是在多线程应用程序中。相反,他们建议使用: