From a58c63bae5fdf040db993fbc6a3e608f7a517ac5 Mon Sep 17 00:00:00 2001 From: Michael Brandt Date: Tue, 21 Dec 2021 16:30:37 -0700 Subject: [PATCH] CumulusLogger: only create new handler if one is not present This fixes the test added in the previous commit Before this change, multiple calls to `CumulusLogger(name)` would construct a `CumulusLogger` instance with the same underlying `Logger` instance, but each construction would also create and attach a new handler, resulting in duplicate messages, e.g.: ``` > python >>> from cumulus_logger import CumulusLogger >>> logger = CumulusLogger('test') >>> logger.info('hello there') {"message": "hello there", "timestamp": "2021-12-21T16:18:09.315309", "level": "info"} >>> >>> logger2 = CumulusLogger('test') >>> logger2.info('hello there') {"message": "hello there", "timestamp": "2021-12-21T16:18:16.845070", "level": "info"} {"message": "hello there", "timestamp": "2021-12-21T16:18:16.845070", "level": "info"} >>> >>> logger.info('hello there') {"message": "hello there", "timestamp": "2021-12-21T16:18:18.165564", "level": "info"} {"message": "hello there", "timestamp": "2021-12-21T16:18:18.165564", "level": "info"} ``` See also the screenshots on https://github.com/ghrcdaac/dmrpp-file-generator-docker/pull/25 With this change, a new handler is only constructed if the underlying `Logger` does not already have any handlers, preventing messages from being handled more than once: ``` > python >>> from cumulus_logger import CumulusLogger >>> logger = CumulusLogger('test') >>> logger.info('hello there') {"message": "hello there", "timestamp": "2021-12-21T16:33:56.735453", "level": "info"} >>> >>> logger2 = CumulusLogger('test') >>> logger2.info('hello there') {"message": "hello there", "timestamp": "2021-12-21T16:34:03.887972", "level": "info"} >>> >>> logger.info('hello there') {"message": "hello there", "timestamp": "2021-12-21T16:34:07.808415", "level": "info"} ``` --- cumulus_logger.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/cumulus_logger.py b/cumulus_logger.py index 9e318bd..83bbbe5 100644 --- a/cumulus_logger.py +++ b/cumulus_logger.py @@ -88,15 +88,18 @@ def _get_exception_message(**kwargs): class CumulusLogger: def __init__(self, name=__name__, level=logging.DEBUG): """Creates a logger with a name and loggging level.""" - log_handler = logging.StreamHandler() - log_handler.setLevel(logging.DEBUG) - log_handler.setFormatter(logging.Formatter('%(message)s')) self.logger = logging.getLogger(name) - self.logger.addHandler(log_handler) self.logger.setLevel(level) + # Avoid duplicate message in AWS cloudwatch self.logger.propagate = False + if not self.logger.handlers: + log_handler = logging.StreamHandler() + log_handler.setLevel(logging.DEBUG) + log_handler.setFormatter(logging.Formatter('%(message)s')) + self.logger.addHandler(log_handler) + self.event = None self.context = None self._msg = {}