From 84b4003bf42fcdd1754c6af7c53d2f6cb0fa8f94 Mon Sep 17 00:00:00 2001 From: Romain Bignon Date: Sat, 30 Oct 2010 16:09:33 +0200 Subject: [PATCH] use several loggers for parts of weboob --- weboob/applications/havesex/havesex.py | 5 ++--- weboob/backends/aum/backend.py | 18 +++++++-------- weboob/backends/aum/browser.py | 7 +++--- weboob/backends/aum/optim/profiles_walker.py | 9 ++++---- weboob/backends/aum/pages/base.py | 9 ++++---- weboob/backends/aum/pages/profile.py | 2 +- weboob/backends/fourchan/backend.py | 4 +--- weboob/backends/fourchan/pages/board.py | 5 ++--- weboob/core/bcall.py | 13 ++++++----- weboob/core/modules.py | 16 ++++++++------ weboob/core/ouiboube.py | 15 +++++++------ weboob/core/scheduler.py | 5 +++-- weboob/tools/backend.py | 10 +++++---- weboob/tools/browser/browser.py | 23 ++++++++++++-------- 14 files changed, 74 insertions(+), 67 deletions(-) diff --git a/weboob/applications/havesex/havesex.py b/weboob/applications/havesex/havesex.py index 39f6531f1e..b3380b8b4f 100644 --- a/weboob/applications/havesex/havesex.py +++ b/weboob/applications/havesex/havesex.py @@ -18,7 +18,6 @@ from __future__ import with_statement -import logging import sys import weboob @@ -97,7 +96,7 @@ def print_node(node, level=1): found = 1 if not found: - logging.error(u'Profile not found') + self.logger.error(u'Profile not found') return True @@ -116,7 +115,7 @@ def optims(self, action, function, optims): except weboob.core.CallErrors, errors: for backend, error, backtrace in errors: if isinstance(error, OptimizationNotFound): - logging.error(u'Optimization "%s" not found' % optim) + self.logger.error(u'Optimization "%s" not found' % optim) def do_start(self, *optims): """ diff --git a/weboob/backends/aum/backend.py b/weboob/backends/aum/backend.py index c8f9c03105..8978eb0580 100644 --- a/weboob/backends/aum/backend.py +++ b/weboob/backends/aum/backend.py @@ -19,7 +19,6 @@ import datetime from dateutil import tz -from logging import warning, debug from weboob.capabilities.base import NotLoaded from weboob.capabilities.chat import ICapChat @@ -30,6 +29,7 @@ from weboob.tools.backend import BaseBackend from weboob.tools.browser import BrowserUnavailable from weboob.tools.value import Value, ValuesDict, ValueBool +from weboob.tools.log import getLogger from .captcha import CaptchaError from .antispam import AntiSpam @@ -105,7 +105,7 @@ def iter_threads(self): if not contact.get_id(): continue if self.antispam and not self.antispam.check(contact): - debug('Skipped a spam-thread from %s' % contact.get_name()) + self.logger.debug('Skipped a spam-thread from %s' % contact.get_name()) self.report_spam(contact.get_id(), contact.get_suppr_id()) continue thread = Thread(contact.get_id()) @@ -141,7 +141,7 @@ def get_thread(self, id, profiles=None, contact=None): for mail in mails: flags = 0 if self.antispam and not self.antispam.check(mail): - debug('Skipped a spam-mail from %s' % mail.sender) + self.logger.debug('Skipped a spam-mail from %s' % mail.sender) self.report_spam(thread.id, contact and contact.get_suppr_id()) break @@ -152,7 +152,7 @@ def get_thread(self, id, profiles=None, contact=None): with self.browser: profiles[mail.profile_link] = self.browser.get_profile(mail.profile_link) if self.antispam and not self.antispam.check(profiles[mail.profile_link]): - debug('Skipped a spam-mail-profile from %s' % mail.sender) + self.logger.debug('Skipped a spam-mail-profile from %s' % mail.sender) self.report_spam(thread.id, contact and contact.get_suppr_id()) break mail.signature += u'\n%s' % profiles[mail.profile_link].get_profile_text() @@ -203,7 +203,7 @@ def iter_unread_messages(self, thread=None): if not contact.get_id(): continue if self.antispam and not self.antispam.check(contact): - debug('Skipped a spam-unread-thread from %s' % contact.get_name()) + self.logger.debug('Skipped a spam-unread-thread from %s' % contact.get_name()) self.report_spam(contact.get_id(), contact.get_suppr_id()) continue slut = self._get_slut(contact.get_id()) @@ -224,7 +224,7 @@ def iter_unread_messages(self, thread=None): new_baskets -= 1 profile = self.browser.get_profile(ids[new_baskets]) if self.antispam and not self.antispam.check(profile): - debug('Skipped a spam-basket from %s' % profile.get_name()) + self.logger.debug('Skipped a spam-basket from %s' % profile.get_name()) self.report_spam(profile.get_id()) continue @@ -242,7 +242,7 @@ def iter_unread_messages(self, thread=None): flags=Message.IS_UNREAD) yield thread.root except BrowserUnavailable, e: - debug('No messages, browser is unavailable: %s' % e) + self.logger.debug('No messages, browser is unavailable: %s' % e) pass # don't care about waiting def set_message_read(self, message): @@ -345,7 +345,7 @@ def iter_contacts(self, status=Contact.STATUS_ALL, ids=None): elif contact['cat'] == 2: s = Contact.STATUS_AWAY else: - warning('Unknown AuM contact status: %s' % contact['cat']) + self.logger.warning('Unknown AuM contact status: %s' % contact['cat']) if not status & s or ids and contact['id'] in ids: continue @@ -405,7 +405,7 @@ def register_account(klass, account): country= account.properties['country'].value, godfather= account.properties['godfather'].value) except CaptchaError: - debug('Unable to resolve captcha. Retrying...') + getLogger('aum').debug('Unable to resolve captcha. Retrying...') browser = None def get_account(self): diff --git a/weboob/backends/aum/browser.py b/weboob/backends/aum/browser.py index 2cf8cbb67b..6033ac5da7 100644 --- a/weboob/backends/aum/browser.py +++ b/weboob/backends/aum/browser.py @@ -18,7 +18,6 @@ import datetime import time -from logging import warning import random import simplejson import urllib @@ -225,20 +224,20 @@ def delete_thread(self, id): @pageaccess def send_charm(self, id): result = self.openurl('http://www.adopteunmec.com/fajax_addBasket.php?id=%s' % id).read() - warning('Charm: %s' % result) + self.logger.warning('Charm: %s' % result) return result.find('noMoreFlashes') < 0 @pageaccess def add_basket(self, id): result = self.openurl('http://www.adopteunmec.com/fajax_addBasket.php?id=%s' % id).read() - warning('Basket: %s' % result) + self.logger.warning('Basket: %s' % result) # TODO check if it works (but it should) return True @pageaccess def deblock(self, id): result = self.openurl('http://www.adopteunmec.com/fajax_postMessage.php?action=deblock&to=%s' % id).read() - warning('Deblock: %s' % result) + self.logger.warning('Deblock: %s' % result) return True @pageaccess diff --git a/weboob/backends/aum/optim/profiles_walker.py b/weboob/backends/aum/optim/profiles_walker.py index 144f580d12..5c961c883d 100644 --- a/weboob/backends/aum/optim/profiles_walker.py +++ b/weboob/backends/aum/optim/profiles_walker.py @@ -18,11 +18,11 @@ from __future__ import with_statement -from logging import info from random import randint from weboob.tools.browser import BrowserUnavailable from weboob.capabilities.dating import Optimization +from weboob.tools.log import getLogger __all__ = ['ProfilesWalker'] @@ -33,9 +33,10 @@ def __init__(self, sched, storage, browser): self.sched = sched self.storage = storage self.browser = browser + self.logger = getLogger('walker', browser.logger) self.visited_profiles = set(storage.get('profiles_walker', 'viewed')) - info(u'Loaded %d already visited profiles from storage.' % len(self.visited_profiles)) + self.logger.info(u'Loaded %d already visited profiles from storage.' % len(self.visited_profiles)) self.profiles_queue = set() def save(self): @@ -57,7 +58,7 @@ def enqueue_profiles(self): try: with self.browser: profiles_to_visit = self.browser.search_profiles().difference(self.visited_profiles) - info(u'Enqueuing profiles to visit: %s' % profiles_to_visit) + self.logger.info(u'Enqueuing profiles to visit: %s' % profiles_to_visit) self.profiles_queue = set(profiles_to_visit) self.save() except BrowserUnavailable: @@ -73,7 +74,7 @@ def view_profile(self): try: with self.browser: profile = self.browser.get_profile(id) - info(u'Visited profile %s (%s)' % (profile.get_name(), id)) + self.logger.info(u'Visited profile %s (%s)' % (profile.get_name(), id)) # Get score from the aum_score module #d = self.nucentral_core.callService(context.Context.fromComponent(self), 'aum_score', 'score', profile) diff --git a/weboob/backends/aum/pages/base.py b/weboob/backends/aum/pages/base.py index 1681ee0fb7..b039e24a35 100644 --- a/weboob/backends/aum/pages/base.py +++ b/weboob/backends/aum/pages/base.py @@ -17,7 +17,6 @@ import re -from logging import error, warning from weboob.tools.browser import BasePage, BrowserUnavailable class PageBase(BasePage): @@ -61,7 +60,7 @@ def score(self): child = tag.childNodes[0].childNodes[0].childNodes[3] return int(child.childNodes[0].childNodes[1].data.replace(' ', '').strip()) - error("Error: I can't find the score :(") + self.logger.error("Error: I can't find the score :(") return '0' def __get_indicator(self, elementName): @@ -74,14 +73,14 @@ def __get_indicator(self, elementName): if not hasattr(child, 'data'): if child.tagName != u'blink': - warning("Warning: %s counter isn't a blink and hasn't data" % elementName) + self.logger.warning("Warning: %s counter isn't a blink and hasn't data" % elementName) child = child.childNodes[0] if not hasattr(child, 'data'): break return int(child.data) - error("Error: I can't find the %s counter :(" % elementName) + self.logger.error("Error: I can't find the %s counter :(" % elementName) return 0 MYNAME_REGEXP = re.compile("Bonjour (.*)") @@ -95,7 +94,7 @@ def get_my_name(self): if m: return m.group(1) - warning('Warning: Unable to fetch name') + self.logger.warning('Warning: Unable to fetch name') return '?' def nb_new_mails(self): diff --git a/weboob/backends/aum/pages/profile.py b/weboob/backends/aum/pages/profile.py index e4146c4379..4ca1a03c49 100644 --- a/weboob/backends/aum/pages/profile.py +++ b/weboob/backends/aum/pages/profile.py @@ -362,7 +362,7 @@ def parse_table(self, div): try: fields[label1].put_value(d, value2) except KeyError: - warning('Unable to find "%s" (%s)' % (label1, repr(label1))) + self.logger.warning('Unable to find "%s" (%s)' % (label1, repr(label1))) elif label1 and label2: # two titles, so there will have a list of value in # next lines on each columns diff --git a/weboob/backends/fourchan/backend.py b/weboob/backends/fourchan/backend.py index 28e4b8adb2..ffe81c55d4 100644 --- a/weboob/backends/fourchan/backend.py +++ b/weboob/backends/fourchan/backend.py @@ -18,8 +18,6 @@ from __future__ import with_statement -from logging import warning - from weboob.capabilities.messages import ICapMessages, Message, Thread from weboob.tools.backend import BaseBackend from weboob.tools.value import Value, ValuesDict @@ -52,7 +50,7 @@ def get_thread(self, id): id = thread.id if not '.' in id: - warning('Malformated ID (%s)' % id) + self.logger.warning('Malformated ID (%s)' % id) return board, thread_id = self._splitid(id) diff --git a/weboob/backends/fourchan/pages/board.py b/weboob/backends/fourchan/pages/board.py index 918f96ecca..24efb92375 100644 --- a/weboob/backends/fourchan/pages/board.py +++ b/weboob/backends/fourchan/pages/board.py @@ -18,7 +18,6 @@ from datetime import datetime import re -from logging import warning from weboob.tools.browser import BasePage @@ -53,7 +52,7 @@ def on_loaded(self): if m: self.board = m.group(1) else: - warning('Unable to find board') + self.logger.warning('Unable to find board') self.board = 'unknown' forms = self.document.getroot().cssselect('form') @@ -65,7 +64,7 @@ def on_loaded(self): break if form is None: - warning('No delform :(') + self.logger.warning('No delform :(') article = None for div in form.getchildren(): diff --git a/weboob/core/bcall.py b/weboob/core/bcall.py index f3739eefda..6cf70040a8 100644 --- a/weboob/core/bcall.py +++ b/weboob/core/bcall.py @@ -19,11 +19,11 @@ from __future__ import with_statement from copy import copy -from logging import debug from threading import Thread, Event, RLock, Timer from weboob.capabilities.base import CapBaseObject from weboob.tools.misc import get_backtrace +from weboob.tools.log import getLogger __all__ = ['BackendsCall', 'CallErrors'] @@ -44,6 +44,7 @@ def __init__(self, backends, function, *args, **kwargs): @param function backends' method name, or callable object @param args, kwargs arguments given to called functions """ + self.logger = getLogger('bcall') # Store if a backend is finished self.backends = {} for backend in backends: @@ -64,7 +65,7 @@ def __init__(self, backends, function, *args, **kwargs): # Create jobs for each backend with self.mutex: for backend in backends: - debug('Creating a new thread for %s' % backend) + self.logger.debug('Creating a new thread for %s' % backend) self.threads.append(Timer(0, self._caller, (backend, function, args, kwargs)).start()) if not backends: self.finish_event.set() @@ -82,21 +83,21 @@ def _store_result(self, backend, result): self.response_event.set() def _caller(self, backend, function, args, kwargs): - debug('%s: Thread created successfully' % backend) + self.logger.debug('%s: Thread created successfully' % backend) with backend: try: # Call method on backend try: - debug('%s: Calling function %s' % (backend, function)) + self.logger.debug('%s: Calling function %s' % (backend, function)) if callable(function): result = function(backend, *args, **kwargs) else: result = getattr(backend, function)(*args, **kwargs) except Exception, error: - debug('%s: Called function %s raised an error: %r' % (backend, function, error)) + self.logger.debug('%s: Called function %s raised an error: %r' % (backend, function, error)) self._store_error(backend, error) else: - debug('%s: Called function %s returned: %r' % (backend, function, result)) + self.logger.debug('%s: Called function %s returned: %r' % (backend, function, result)) if hasattr(result, '__iter__') and not isinstance(result, basestring): # Loop on iterator diff --git a/weboob/core/modules.py b/weboob/core/modules.py index 7db037d2aa..bfe02debdc 100644 --- a/weboob/core/modules.py +++ b/weboob/core/modules.py @@ -19,12 +19,12 @@ from __future__ import with_statement import logging -from logging import debug, error, exception import os import re from weboob.capabilities.base import IBaseCap from weboob.tools.backend import BaseBackend +from weboob.tools.log import getLogger __all__ = ['Module', 'ModulesLoader'] @@ -32,6 +32,7 @@ class Module(object): def __init__(self, package): + self.logger = getLogger('backend') self.package = package self.klass = None for attrname in dir(self.package): @@ -89,14 +90,15 @@ def has_caps(self, *caps): return False def create_instance(self, weboob, instance_name, config, storage): - backend_instance = self.klass(weboob, instance_name, config, storage) - debug(u'Created backend instance "%s" for backend "%s"' % (instance_name, self.name)) + backend_instance = self.klass(weboob, instance_name, config, storage, self.logger) + self.logger.debug(u'Created backend instance "%s" for backend "%s"' % (instance_name, self.name)) return backend_instance class ModulesLoader(object): def __init__(self): self.loaded = {} + self.logger = getLogger('modules') def get_or_load_module(self, module_name): if module_name not in self.loaded: @@ -129,13 +131,13 @@ def load_module(self, module_name): except ImportError, e: msg = u'Unable to load module "%s": %s' % (module_name, e) if logging.root.level == logging.DEBUG: - exception(msg) + self.logger.exception(msg) return else: - error(msg) + self.logger.error(msg) return if module.name in self.loaded: - debug('Module "%s" is already loaded from %s' % (module_name, module.package.__path__[0])) + self.logger.debug('Module "%s" is already loaded from %s' % (module_name, module.package.__path__[0])) return self.loaded[module.name] = module - debug('Loaded module "%s" from %s' % (module_name, module.package.__path__[0])) + self.logger.debug('Loaded module "%s" from %s' % (module_name, module.package.__path__[0])) diff --git a/weboob/core/ouiboube.py b/weboob/core/ouiboube.py index 48a4244ae0..7e34c28c6c 100644 --- a/weboob/core/ouiboube.py +++ b/weboob/core/ouiboube.py @@ -18,7 +18,6 @@ from __future__ import with_statement -from logging import warning import os from weboob.core.bcall import BackendsCall @@ -26,6 +25,7 @@ from weboob.core.backendscfg import BackendsConfig from weboob.core.scheduler import Scheduler from weboob.tools.backend import BaseBackend +from weboob.tools.log import getLogger __all__ = ['Weboob'] @@ -36,6 +36,7 @@ class Weboob(object): BACKENDS_FILENAME = 'backends' def __init__(self, workdir=WORKDIR, backends_filename=None, scheduler=None, storage=None): + self.logger = getLogger('weboob') self.workdir = workdir self.backend_instances = {} @@ -48,7 +49,7 @@ def __init__(self, workdir=WORKDIR, backends_filename=None, scheduler=None, stor if not os.path.exists(self.workdir): os.mkdir(self.workdir, 0700) elif not os.path.isdir(self.workdir): - warning(u'"%s" is not a directory' % self.workdir) + self.logger.warning(u'"%s" is not a directory' % self.workdir) # Backends loader self.modules_loader = ModulesLoader() @@ -96,15 +97,15 @@ def load_backends(self, caps=None, names=None, modules=None, storage=None, error continue module = self.modules_loader.get_or_load_module(module_name) if module is None: - warning(u'Backend "%s" is referenced in ~/.weboob/backends ' - 'configuration file, but was not found. ' - 'Hint: is it installed?' % module_name) + self.logger.warning(u'Backend "%s" is referenced in ~/.weboob/backends ' + 'configuration file, but was not found. ' + 'Hint: is it installed?' % module_name) continue if caps is not None and not module.has_caps(caps): continue if instance_name in self.backend_instances: - warning(u'Oops, the backend "%s" is already loaded. Unload it before reloading...' % instance_name) + self.logger.warning(u'Oops, the backend "%s" is already loaded. Unload it before reloading...' % instance_name) self.unload_backends(instance_name) try: @@ -186,7 +187,7 @@ def do(self, function, *args, **kwargs): else: backends.append(backend) else: - warning(u'The "backends" value isn\'t supported: %r' % _backends) + self.logger.warning(u'The "backends" value isn\'t supported: %r' % _backends) if 'caps' in kwargs: caps = kwargs.pop('caps') diff --git a/weboob/core/scheduler.py b/weboob/core/scheduler.py index 32056ff26a..cc8fea397c 100644 --- a/weboob/core/scheduler.py +++ b/weboob/core/scheduler.py @@ -18,8 +18,8 @@ from __future__ import with_statement -import logging from threading import Timer, Event, RLock +from weboob.tools.log import getLogger __all__ = ['Scheduler'] @@ -40,6 +40,7 @@ def want_stop(self): class Scheduler(IScheduler): def __init__(self): + self.logger = getLogger('scheduler') self.mutex = RLock() self.stop_event = Event() self.count = 0 @@ -51,7 +52,7 @@ def schedule(self, interval, function, *args): with self.mutex: self.count += 1 - logging.debug('function "%s" will be called in %s seconds' % (function.__name__, interval)) + self.logger.debug('function "%s" will be called in %s seconds' % (function.__name__, interval)) timer = Timer(interval, self._callback, (self.count, function, args)) self.queue[self.count] = timer timer.start() diff --git a/weboob/tools/backend.py b/weboob/tools/backend.py index e03dd066bb..3eaeb2d8ed 100644 --- a/weboob/tools/backend.py +++ b/weboob/tools/backend.py @@ -18,10 +18,10 @@ import os from threading import RLock -from logging import debug from weboob.capabilities.base import CapBaseObject, FieldNotFound, IBaseCap, NotLoaded from weboob.tools.misc import iter_fields +from weboob.tools.log import getLogger __all__ = ['BaseBackend', 'ObjectNotAvailable'] @@ -95,7 +95,8 @@ def __exit__(self, t, v, tb): def __repr__(self): return u"" % self.name - def __init__(self, weboob, name, config, storage): + def __init__(self, weboob, name, config, storage, logger=None): + self.logger = getLogger(self.NAME, parent=logger) self.weboob = weboob self.name = name self.lock = RLock() @@ -143,7 +144,7 @@ def ICON(self): try: import xdg.IconTheme except ImportError: - debug(u'Python xdg module was not found. Please install it to read icon files.') + self.logger.debug(u'Python xdg module was not found. Please install it to read icon files.') else: return xdg.IconTheme.getIconPath(self.NAME) @@ -178,6 +179,7 @@ def create_browser(self, *args, **kwargs): kwargs['proxy'] = self._private_config['_proxy'] elif 'HTTP_PROXY' in os.environ: kwargs['proxy'] = os.environ['HTTP_PROXY'] + kwargs['logger'] = self.logger return self.BROWSER(*args, **kwargs) @@ -235,5 +237,5 @@ def not_loaded(v): for key, value in self.OBJECTS.iteritems(): if isinstance(obj, key): - debug(u'Fill %r with fields: %s' % (obj, missing_fields)) + self.logger.debug(u'Fill %r with fields: %s' % (obj, missing_fields)) return value(self, obj, missing_fields) or obj diff --git a/weboob/tools/browser/browser.py b/weboob/tools/browser/browser.py index b1f4de1010..4f7147de9b 100644 --- a/weboob/tools/browser/browser.py +++ b/weboob/tools/browser/browser.py @@ -24,7 +24,7 @@ ControlNotFoundError = ClientForm.ControlNotFoundError import re import time -from logging import warning, debug +from logging import warning from copy import copy from threading import RLock import os @@ -32,6 +32,7 @@ from weboob.tools.parsers import get_parser from weboob.tools.decorators import retry +from weboob.tools.log import getLogger # Try to load cookies try: @@ -91,12 +92,13 @@ class BasePage(object): """ Base page """ - def __init__(self, browser, document, url='', groups=None, group_dict=None): + def __init__(self, browser, document, url='', groups=None, group_dict=None, logger=None): self.browser = browser self.document = document self.url = url self.groups = groups self.group_dict = group_dict + self.logger = getLogger('page', logger) def on_loaded(self): """ @@ -156,7 +158,7 @@ def is_logged(self): default_features.remove('_robots') def __init__(self, username=None, password=None, firefox_cookies=None, - parser=None, history=NoHistory(), proxy=None): + parser=None, history=NoHistory(), proxy=None, logger=None): """ Constructor of Browser. @@ -167,8 +169,11 @@ def __init__(self, username=None, password=None, firefox_cookies=None, @param parser [IParser] parser to use on HTML files. @param hisory [object] History manager. Default value is an object which does not keep history. + @param proxy [str] proxy URL to use. """ mechanize.Browser.__init__(self, history=history) + self.logger = getLogger('browser', logger) + self.addheaders = [ ['User-agent', self.USER_AGENT] ] @@ -242,7 +247,7 @@ def openurl(self, *args, **kwargs): Open an URL but do not create a Page object. """ if_fail = kwargs.pop('if_fail', 'raise') - debug('Opening URL "%s", %s' % (args, kwargs)) + self.logger.debug('Opening URL "%s", %s' % (args, kwargs)) try: return mechanize.Browser.open_novisit(self, *args, **kwargs) except (mechanize.response_seek_wrapper, urllib2.HTTPError, urllib2.URLError, BadStatusLine), e: @@ -280,7 +285,7 @@ def save_response(self, result): fd, path = tempfile.mkstemp(prefix="response", dir=tmpdir) with os.fdopen(fd, 'w') as f: f.write(result.read()) - debug("Response saved to %s" % path) + self.logger.debug("Response saved to %s" % path) result.seek(0) def submit(self, *args, **kwargs): @@ -366,23 +371,23 @@ def _change_location(self, result): #if isinstance(data, unicode): # data = data.encode('utf-8') #print data - warning('Oh my fucking god, there isn\'t any page corresponding to URL %s' % result.geturl()) + self.logger.warning('Oh my fucking god, there isn\'t any page corresponding to URL %s' % result.geturl()) self.save_response(result) return - debug('[user_id=%s] Went on %s' % (self.username, result.geturl())) + self.logger.debug('[user_id=%s] Went on %s' % (self.username, result.geturl())) self.last_update = time.time() if self.SAVE_RESPONSES: self.save_response(result) document = self.get_document(result) - self.page = pageCls(self, document, result.geturl(), groups=page_groups, group_dict=page_group_dict) + self.page = pageCls(self, document, result.geturl(), groups=page_groups, group_dict=page_group_dict, logger=self.logger) self.page.on_loaded() if self.password is not None and not self.is_logged(): - debug('!! Relogin !!') + self.logger.debug('!! Relogin !!') self.login() return -- GitLab