33import logging
44from typing import TYPE_CHECKING
55
6+ from aws_lambda_powertools .logging .buffer .handler import BufferingHandler
7+
68if TYPE_CHECKING :
79 from collections .abc import Callable
810
@@ -16,6 +18,7 @@ def copy_config_to_registered_loggers(
1618 source_logger : Logger ,
1719 log_level : int | str | None = None ,
1820 ignore_log_level = False ,
21+ include_buffering = False ,
1922 exclude : set [str ] | None = None ,
2023 include : set [str ] | None = None ,
2124) -> None :
@@ -30,6 +33,8 @@ def copy_config_to_registered_loggers(
3033 Logging level to set to registered loggers, by default uses source_logger logging level
3134 ignore_log_level: bool
3235 Whether to not touch log levels for discovered loggers. log_level param is disregarded when this is set.
36+ include_buffering: bool
37+ Whether to buffer logs from external libraries and report to powertools logger
3338 include : set[str] | None, optional
3439 List of logger names to include, by default all registered loggers are included
3540 exclude : set[str] | None, optional
@@ -64,7 +69,13 @@ def copy_config_to_registered_loggers(
6469
6570 registered_loggers = _find_registered_loggers (loggers = loggers , filter_func = filter_func )
6671 for logger in registered_loggers :
67- _configure_logger (source_logger = source_logger , logger = logger , level = level , ignore_log_level = ignore_log_level )
72+ _configure_logger (
73+ source_logger = source_logger ,
74+ logger = logger ,
75+ level = level ,
76+ ignore_log_level = ignore_log_level ,
77+ include_buffering = include_buffering ,
78+ )
6879
6980
7081def _include_registered_loggers_filter (loggers : set [str ]):
@@ -92,6 +103,7 @@ def _configure_logger(
92103 logger : logging .Logger ,
93104 level : int | str ,
94105 ignore_log_level : bool = False ,
106+ include_buffering : bool = False ,
95107) -> None :
96108 # customers may not want to copy the same log level from Logger to discovered loggers
97109 if not ignore_log_level :
@@ -102,6 +114,17 @@ def _configure_logger(
102114 logger .propagate = False # ensure we don't propagate logs to existing loggers, #1073
103115 source_logger .append_keys (name = "%(name)s" ) # include logger name, see #1267
104116
117+ buffer_config = getattr (source_logger , "_buffer_config" , None )
118+ if include_buffering and buffer_config is not None :
119+ buffer_handler = BufferingHandler (
120+ buffer_cache = source_logger ._buffer_cache ,
121+ buffer_config = buffer_config ,
122+ source_logger = source_logger ,
123+ )
124+ logger .addHandler (buffer_handler )
125+ LOGGER .debug (f"Logger { logger } configured with BufferingHandler" )
126+ return # exit earlier and don't add source handlers, would cause double logging
127+
105128 for source_handler in source_logger .handlers :
106129 logger .addHandler (source_handler )
107130 LOGGER .debug (f"Logger { logger } reconfigured to use { source_handler } " )
0 commit comments