2222 LOGGER_ATTRIBUTE_HANDLER ,
2323 LOGGER_ATTRIBUTE_POWERTOOLS_HANDLER ,
2424 LOGGER_ATTRIBUTE_PRECONFIGURED ,
25+ LOGGER_BUFFER_FIRST_INVOKE ,
26+ )
27+ from aws_lambda_powertools .logging .exceptions import (
28+ InvalidBufferItem ,
29+ InvalidLoggerSamplingRateError ,
30+ OrphanedChildLoggerError ,
2531)
26- from aws_lambda_powertools .logging .exceptions import InvalidLoggerSamplingRateError , OrphanedChildLoggerError
2732from aws_lambda_powertools .logging .filters import SuppressFilter
2833from aws_lambda_powertools .logging .formatter import (
2934 RESERVED_FORMATTER_CUSTOM_KEYS ,
3439from aws_lambda_powertools .shared import constants
3540from aws_lambda_powertools .shared .functions import (
3641 extract_event_from_common_models ,
42+ get_tracer_id ,
3743 resolve_env_var_choice ,
3844 resolve_truthy_env_var_choice ,
3945)
4046from aws_lambda_powertools .utilities import jmespath_utils
47+ from aws_lambda_powertools .warnings import PowertoolsUserWarning
4148
4249if TYPE_CHECKING :
4350 from aws_lambda_powertools .logging .buffer .config import LoggerBufferConfig
@@ -518,14 +525,62 @@ def _add_log_record_to_buffer(
518525 level : int ,
519526 msg : object ,
520527 args : object ,
521- exc_info : logging ._ExcInfoType ,
522- stack_info : bool ,
523- extra : Mapping [str , object ],
528+ exc_info : logging ._ExcInfoType = None ,
529+ stack_info : bool = False ,
530+ extra : Mapping [str , object ] | None = None ,
524531 ):
525- tracer_id = os .getenv (constants .XRAY_TRACE_ID_ENV , None )
526- if tracer_id :
532+ """
533+ Add log record to buffer with intelligent tracer ID handling.
534+
535+ Parameters
536+ ----------
537+ level : int
538+ Logging level of the record.
539+ msg : object
540+ Log message to be recorded.
541+ args : object
542+ Additional arguments for the log message.
543+ exc_info : logging._ExcInfoType, optional
544+ Exception information for the log record.
545+ stack_info : bool, optional
546+ Whether to include stack information.
547+ extra : Mapping[str, object], optional
548+ Additional contextual information for the log record.
549+
550+ Raises
551+ ------
552+ InvalidBufferItem
553+ If the log record cannot be added to the buffer.
554+
555+ Notes
556+ -----
557+ Handles special first invocation buffering and migration of log records
558+ between different tracer contexts.
559+ """
560+ # Determine tracer ID, defaulting to first invoke marker
561+ tracer_id = get_tracer_id () or LOGGER_BUFFER_FIRST_INVOKE
562+
563+ try :
564+ # Create log record for buffering
527565 log_record : dict [str , Any ] = _create_buffer_record (level = level , msg = msg , args = args , extra = extra )
566+
567+ # Migrate log records from first invoke to current tracer context
568+ if tracer_id != LOGGER_BUFFER_FIRST_INVOKE and self ._buffer_cache .get (LOGGER_BUFFER_FIRST_INVOKE ):
569+ # Retrieve first invoke log records
570+ first_invoke_items = self ._buffer_cache .get (LOGGER_BUFFER_FIRST_INVOKE )
571+
572+ # Transfer log records to current tracer context
573+ for item in first_invoke_items :
574+ self ._buffer_cache .add (tracer_id , item )
575+
576+ # Clear first invoke buffer
577+ self ._buffer_cache .clear (LOGGER_BUFFER_FIRST_INVOKE )
578+
579+ # Add current log record to buffer
528580 self ._buffer_cache .add (tracer_id , log_record )
581+ except InvalidBufferItem as exc :
582+ # Wrap and re-raise buffer addition error
583+ raise InvalidBufferItem ("Cannot add item to the buffer" ) from exc
529584
530585 def flush_buffer (self ):
531586 """
@@ -535,17 +590,27 @@ def flush_buffer(self):
535590 -----
536591 Retrieves log records for current trace from buffer
537592 Immediately processes and logs each record
593+ Warning if some cache was evicted in that execution
538594 Clears buffer after complete processing
539595
540596 Raises
541597 ------
542598 Any exceptions from underlying logging or buffer mechanisms
543599 will be propagated to caller
544600 """
545- tracer_id = os . getenv ( constants . XRAY_TRACE_ID_ENV , None )
601+ tracer_id = get_tracer_id ( )
546602 for log_line in self ._buffer_cache .get (tracer_id ):
547603 self ._create_and_flush_log_record (log_line )
548604
605+ if self ._buffer_cache .has_evicted :
606+ warnings .warn (
607+ message = "Some logs are not displayed because they were evicted from the buffer. "
608+ "Increase buffer size to store more logs in the buffer" ,
609+ category = PowertoolsUserWarning ,
610+ stacklevel = 2 ,
611+ )
612+ self ._buffer_cache .has_evicted = False
613+
549614 self ._buffer_cache .clear ()
550615
551616 def debug (
0 commit comments