From b2765aabd817f26ea40b4373aae1fc84ac86cc2b Mon Sep 17 00:00:00 2001 From: Alexander Chekunkov Date: Wed, 27 May 2015 13:52:47 +0700 Subject: [PATCH] LogCounterHandler is never removed from root handlers list, fix that lambda is garbage collected and because receiver is added as weak reference by default - when signals.engine_stopped is fired logging.root.removeHandler is not executed. Fixed that by assigning lambda to a private argument and not by using connect(..., weak=False) because I belive this lambda function should be collected with crawler object --- scrapy/crawler.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scrapy/crawler.py b/scrapy/crawler.py index e6f4b225f..8ec253ed9 100644 --- a/scrapy/crawler.py +++ b/scrapy/crawler.py @@ -35,8 +35,10 @@ class Crawler(object): handler = LogCounterHandler(self, level=settings.get('LOG_LEVEL')) logging.root.addHandler(handler) - self.signals.connect(lambda: logging.root.removeHandler(handler), - signals.engine_stopped) + # lambda is assigned to Crawler attribute because this way it is not + # garbage collected after leaving __init__ scope + self.__remove_handler = lambda: logging.root.removeHandler(handler) + self.signals.connect(self.__remove_handler, signals.engine_stopped) lf_cls = load_object(self.settings['LOG_FORMATTER']) self.logformatter = lf_cls.from_crawler(self)