@@ -233,14 +233,14 @@ def __init__(
233
233
self .child = child
234
234
self .logger_formatter = logger_formatter
235
235
self ._stream = stream or sys .stdout
236
- self .logger_handler = logger_handler or logging .StreamHandler (self ._stream )
237
236
self .log_uncaught_exceptions = log_uncaught_exceptions
238
237
239
238
self ._is_deduplication_disabled = resolve_truthy_env_var_choice (
240
239
env = os .getenv (constants .LOGGER_LOG_DEDUPLICATION_ENV , "false" ),
241
240
)
242
241
self ._default_log_keys = {"service" : self .service , "sampling_rate" : self .sampling_rate }
243
242
self ._logger = self ._get_logger ()
243
+ self .logger_handler = self ._get_handler (custom_handler = logger_handler )
244
244
245
245
# NOTE: This is primarily to improve UX, so IDEs can autocomplete LambdaPowertoolsFormatter options
246
246
# previously, we masked all of them as kwargs thus limiting feature discovery
@@ -279,6 +279,15 @@ def _get_logger(self) -> logging.Logger:
279
279
280
280
return logging .getLogger (logger_name )
281
281
282
+ def _get_handler (self , custom_handler : logging .Handler ):
283
+ if self .child :
284
+ return self ._logger .parent .powertools_handler
285
+
286
+ if custom_handler :
287
+ return custom_handler
288
+
289
+ return logging .StreamHandler (self ._stream )
290
+
282
291
def _init_logger (
283
292
self ,
284
293
formatter_options : Optional [Dict ] = None ,
@@ -317,6 +326,7 @@ def _init_logger(
317
326
# std logging will return the same Logger with our attribute if name is reused
318
327
logger .debug (f"Marking logger { self .service } as preconfigured" )
319
328
self ._logger .init = True # type: ignore[attr-defined]
329
+ self ._logger .powertools_handler = self .logger_handler # type: ignore[attr-defined]
320
330
321
331
def _configure_sampling (self ) -> None :
322
332
"""Dynamically set log level based on sampling rate
@@ -672,10 +682,7 @@ def removeFilter(self, filter: logging._FilterType) -> None: # noqa: A002 # fil
672
682
@property
673
683
def registered_handler (self ) -> logging .Handler :
674
684
"""Convenience property to access the first logger handler"""
675
- # We ignore mypy here because self.child encodes whether or not self._logger.parent is
676
- # None, mypy can't see this from context but we can
677
- handlers = self ._logger .parent .handlers if self .child else self ._logger .handlers # type: ignore[union-attr]
678
- return handlers [0 ]
685
+ return self .logger_handler
679
686
680
687
@property
681
688
def registered_formatter (self ) -> BasePowertoolsFormatter :
0 commit comments