Skip to content

Commit f735014

Browse files
committed
bugfix: #249 do not touch preconfigurred loggers
1 parent bf4ef14 commit f735014

File tree

1 file changed

+26
-15
lines changed

1 file changed

+26
-15
lines changed

aws_lambda_powertools/logging/logger.py

+26-15
Original file line numberDiff line numberDiff line change
@@ -148,21 +148,32 @@ def _get_logger(self):
148148
def _init_logger(self, **kwargs):
149149
"""Configures new logger"""
150150

151-
# Skip configuration if it's a child logger to prevent
152-
# multiple handlers being attached as well as different sampling mechanisms
153-
# and multiple messages from being logged as handlers can be duplicated
154-
if not self.child:
155-
self._configure_sampling()
156-
self._logger.setLevel(self.log_level)
157-
self._logger.addHandler(self._handler)
158-
self.structure_logs(**kwargs)
159-
160-
logger.debug("Adding filter in root logger to suppress child logger records to bubble up")
161-
for handler in logging.root.handlers:
162-
# It'll add a filter to suppress any child logger from self.service
163-
# Where service is Order, it'll reject parent logger Order,
164-
# and child loggers such as Order.checkout, Order.shared
165-
handler.addFilter(SuppressFilter(self.service))
151+
# Skip configuration if it's a child logger or a pre-configured logger
152+
# to prevent the following:
153+
# a) multiple handlers being attached
154+
# b) different sampling mechanisms
155+
# c) multiple messages from being logged as handlers can be duplicated
156+
is_logger_preconfigured = getattr(self._logger, "init", False)
157+
if self.child or is_logger_preconfigured:
158+
return
159+
160+
self._configure_sampling()
161+
self._logger.setLevel(self.log_level)
162+
self._logger.addHandler(self._handler)
163+
self.structure_logs(**kwargs)
164+
165+
logger.debug("Adding filter in root logger to suppress child logger records to bubble up")
166+
for handler in logging.root.handlers:
167+
# It'll add a filter to suppress any child logger from self.service
168+
# Where service is Order, it'll reject parent logger Order,
169+
# and child loggers such as Order.checkout, Order.shared
170+
handler.addFilter(SuppressFilter(self.service))
171+
172+
# as per bug in #249, we should not be pre-configuring an existing logger
173+
# therefore we set a custom attribute in the Logger that will be returned
174+
# std logging will return the same Logger with our attribute if name is reused
175+
logger.debug(f"Marking logger {self.service} as preconfigured")
176+
self._logger.init = True
166177

167178
def _configure_sampling(self):
168179
"""Dynamically set log level based on sampling rate

0 commit comments

Comments
 (0)