diff --git a/blinkpy/blinkpy.py b/blinkpy/blinkpy.py index d45de0e..01b6cbe 100644 --- a/blinkpy/blinkpy.py +++ b/blinkpy/blinkpy.py @@ -25,16 +25,17 @@ from dateutil.parser import parse from blinkpy import api from blinkpy.sync_module import BlinkSyncModule from blinkpy.helpers import errors as ERROR +from blinkpy.helpers import log from blinkpy.helpers.util import ( create_session, merge_dicts, get_time, BlinkURLHandler, - BlinkAuthenticationException, RepeatLogHandler) + BlinkAuthenticationException) from blinkpy.helpers.constants import ( BLINK_URL, LOGIN_URL, LOGIN_BACKUP_URL) from blinkpy.helpers.constants import __version__ REFRESH_RATE = 30 -_LOGGER = logging.getLogger('blinkpy') +_LOGGER = log.create_logger('blinkpy') class Blink(): @@ -75,8 +76,8 @@ class Blink(): self.version = __version__ self.allow_duplicate_logs = allow_duplicate_logs - _LOGGER.addHandler(RepeatLogHandler()) - _LOGGER.setLevel(loglevel) + self.loglevel = loglevel + self._reset_logger() @property def auth_header(self): @@ -90,8 +91,8 @@ class Blink(): Method logs in and sets auth token, urls, and ids for future requests. Essentially this is just a wrapper function for ease of use. """ - if not self.allow_duplicate_logs: - self._reset_logger() + self._reset_logger() + if self._username is None or self._password is None: if not self.login(): return @@ -223,10 +224,6 @@ class Blink(): Use a list for multiple cameras. :param stop: Page to stop on (~25 items per page. Default page 10). """ - # Reset the handler so we don't filter out messages during this method. - if not self.allow_duplicate_logs: - self._reset_logger() - if since is None: since_epochs = self.last_refresh else: @@ -293,6 +290,10 @@ class Blink(): def _reset_logger(self): """Reset the log handler.""" for handler in _LOGGER.handlers: - handler.close() _LOGGER.removeHandler(handler) - _LOGGER.addHandler(RepeatLogHandler()) + handler.close() + _LOGGER.setLevel(self.loglevel) + if self.allow_duplicate_logs: + _LOGGER.addHandler(logging.StreamHandler()) + else: + _LOGGER.addHandler(log.RepeatLogHandler()) diff --git a/blinkpy/helpers/log.py b/blinkpy/helpers/log.py new file mode 100644 index 0000000..80aa72b --- /dev/null +++ b/blinkpy/helpers/log.py @@ -0,0 +1,26 @@ +"""Module for blinkpy logging.""" +import logging + + +def create_logger(name): + """Create a logger instance.""" + handler = RepeatLogHandler() + logger = logging.getLogger(name) + logger.setLevel(logging.DEBUG) + logger.addHandler(handler) + return logger + + +class RepeatLogHandler(logging.StreamHandler): + """Log handler for repeat entries.""" + + def __init__(self): + """Initialize repeat log handler.""" + super().__init__() + self.log_record = set() + + def emit(self, record): + """Ensure we only log a message once.""" + if record.msg not in self.log_record: + self.log_record.add(record.msg) + super().emit(record) diff --git a/blinkpy/helpers/util.py b/blinkpy/helpers/util.py index e4758ed..0023dd3 100644 --- a/blinkpy/helpers/util.py +++ b/blinkpy/helpers/util.py @@ -121,18 +121,3 @@ class BlinkURLHandler(): self.networks_url = "{}/networks".format(self.base_url) self.video_url = "{}/api/v2/videos".format(self.base_url) _LOGGER.debug("Setting base url to %s.", self.base_url) - - -class RepeatLogHandler(logging.StreamHandler): - """Log handler for repeat entries.""" - - def __init__(self): - """Initialize repeat log handler.""" - super().__init__() - self.log_record = set() - - def emit(self, record): - """Ensure we only log a message once.""" - if record.msg not in self.log_record: - self.log_record.add(record.msg) - super().emit(record)