在其中一种脚本中,日志记录的设置如下:
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'对象中。请注意,每个重复的日志条目上的时间戳都完全相同。
任何想法如何避免/解决此问题?
答案 0 :(得分:0)
我认为在每次后续启动时,会将'fileHandler'的新实例添加到'logger'对象中
是的,我认为是正确的。为避免这种情况,您可以检测是否已定义fh
和ch
,因此无需重新定义它们并将它们添加到每次运行的logging
中。
为此,您可以添加如下代码:
from IPython import get_ipython
if not 'fh' in get_ipython().user_ns:
fh = logging.FileHandler('logfile')
fh.setLevel(logging.DEBUG)
...
与ch
相同。