Spyder IDE;由于奇怪的日志记录问题而重置了IPython控制台状态

时间:2018-12-06 17:06:09

标签: python ipython spyder

在其中一种脚本中,日志记录的设置如下:

logging configuration - two handlers
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler('logfile')
fh.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
logger.addHandler(fh)
logger.addHandler(ch)

很普通的记录器,对吗?当然,但这会导致Spyder的IPython控制台行为异常。

每次后续脚本启动(通过内部IPython控制台通过Spyder的“运行”)都会增加记录每条日志消息的次数,即,第二次启动脚本时,该消息出现两次,第三次出现三次,然后等等。

2018-12-06 17:03:44,888 - root - DEBUG - Start.
2018-12-06 17:03:44,891 - root - DEBUG - Exit.
2018-12-06 17:03:45,982 - root - DEBUG - Start.
2018-12-06 17:03:45,982 - root - DEBUG - Start.
2018-12-06 17:03:45,984 - root - DEBUG - Exit.
2018-12-06 17:03:45,984 - root - DEBUG - Exit.
2018-12-06 17:03:49,739 - root - DEBUG - Start.
2018-12-06 17:03:49,739 - root - DEBUG - Start.
2018-12-06 17:03:49,739 - root - DEBUG - Start.
2018-12-06 17:03:49,742 - root - DEBUG - Exit.
2018-12-06 17:03:49,742 - root - DEBUG - Exit.
2018-12-06 17:03:49,742 - root - DEBUG - Exit.

重新启动IPython的内核或跨越新的控制台实例将重置此行为。 “重置变量”似乎对此没有影响?

我认为在每次后续启动时,会将'fileHandlers'的新实例添加到'logger'对象中。请注意,每个重复的日志条目上的时间戳都完全相同。

任何想法如何避免/解决此问题?

1 个答案:

答案 0 :(得分:0)

  

我认为在每次后续启动时,会将'fileHandler'的新实例添加到'logger'对象中

是的,我认为是正确的。为避免这种情况,您可以检测是否已定义fhch,因此无需重新定义它们并将它们添加到每次运行的logging中。

为此,您可以添加如下代码:

from IPython import get_ipython

if not 'fh' in get_ipython().user_ns:
    fh = logging.FileHandler('logfile')
    fh.setLevel(logging.DEBUG)
    ...

ch相同。