88from aws_durable_execution_sdk_python .types import LoggerInterface
99
1010if TYPE_CHECKING :
11- from collections .abc import Mapping , MutableMapping
11+ from collections .abc import Callable , Mapping , MutableMapping
1212
13+ from aws_durable_execution_sdk_python .context import ExecutionState
1314 from aws_durable_execution_sdk_python .identifier import OperationIdentifier
1415
1516
1617@dataclass (frozen = True )
1718class LogInfo :
18- execution_arn : str
19+ execution_state : ExecutionState
1920 parent_id : str | None = None
2021 operation_id : str | None = None
2122 name : str | None = None
2223 attempt : int | None = None
2324
2425 @classmethod
2526 def from_operation_identifier (
26- cls , execution_arn : str , op_id : OperationIdentifier , attempt : int | None = None
27+ cls ,
28+ execution_state : ExecutionState ,
29+ op_id : OperationIdentifier ,
30+ attempt : int | None = None ,
2731 ) -> LogInfo :
2832 """Create new log info from an execution arn, OperationIdentifier and attempt."""
2933 return cls (
30- execution_arn = execution_arn ,
34+ execution_state = execution_state ,
3135 parent_id = op_id .parent_id ,
3236 operation_id = op_id .operation_id ,
3337 name = op_id .name ,
@@ -37,7 +41,7 @@ def from_operation_identifier(
3741 def with_parent_id (self , parent_id : str ) -> LogInfo :
3842 """Clone the log info with a new parent id."""
3943 return LogInfo (
40- execution_arn = self .execution_arn ,
44+ execution_state = self .execution_state ,
4145 parent_id = parent_id ,
4246 operation_id = self .operation_id ,
4347 name = self .name ,
@@ -47,25 +51,33 @@ def with_parent_id(self, parent_id: str) -> LogInfo:
4751
4852class Logger (LoggerInterface ):
4953 def __init__ (
50- self , logger : LoggerInterface , default_extra : Mapping [str , object ]
54+ self ,
55+ logger : LoggerInterface ,
56+ default_extra : Mapping [str , object ],
57+ execution_state : ExecutionState ,
5158 ) -> None :
5259 self ._logger = logger
5360 self ._default_extra = default_extra
61+ self ._execution_state = execution_state
5462
5563 @classmethod
5664 def from_log_info (cls , logger : LoggerInterface , info : LogInfo ) -> Logger :
5765 """Create a new logger with the given LogInfo."""
58- extra : MutableMapping [str , object ] = {"execution_arn" : info .execution_arn }
66+ extra : MutableMapping [str , object ] = {
67+ "executionArn" : info .execution_state .durable_execution_arn
68+ }
5969 if info .parent_id :
60- extra ["parent_id " ] = info .parent_id
70+ extra ["parentId " ] = info .parent_id
6171 if info .name :
6272 # Use 'operation_name' instead of 'name' as key because the stdlib LogRecord internally reserved 'name' parameter
63- extra ["operation_name " ] = info .name
73+ extra ["operationName " ] = info .name
6474 if info .attempt is not None :
6575 extra ["attempt" ] = info .attempt + 1
6676 if info .operation_id :
67- extra ["operation_id" ] = info .operation_id
68- return cls (logger , extra )
77+ extra ["operationId" ] = info .operation_id
78+ return cls (
79+ logger = logger , default_extra = extra , execution_state = info .execution_state
80+ )
6981
7082 def with_log_info (self , info : LogInfo ) -> Logger :
7183 """Clone the existing logger with new LogInfo."""
@@ -81,29 +93,39 @@ def get_logger(self) -> LoggerInterface:
8193 def debug (
8294 self , msg : object , * args : object , extra : Mapping [str , object ] | None = None
8395 ) -> None :
84- merged_extra = {** self ._default_extra , ** (extra or {})}
85- self ._logger .debug (msg , * args , extra = merged_extra )
96+ self ._log (self ._logger .debug , msg , * args , extra = extra )
8697
8798 def info (
8899 self , msg : object , * args : object , extra : Mapping [str , object ] | None = None
89100 ) -> None :
90- merged_extra = {** self ._default_extra , ** (extra or {})}
91- self ._logger .info (msg , * args , extra = merged_extra )
101+ self ._log (self ._logger .info , msg , * args , extra = extra )
92102
93103 def warning (
94104 self , msg : object , * args : object , extra : Mapping [str , object ] | None = None
95105 ) -> None :
96- merged_extra = {** self ._default_extra , ** (extra or {})}
97- self ._logger .warning (msg , * args , extra = merged_extra )
106+ self ._log (self ._logger .warning , msg , * args , extra = extra )
98107
99108 def error (
100109 self , msg : object , * args : object , extra : Mapping [str , object ] | None = None
101110 ) -> None :
102- merged_extra = {** self ._default_extra , ** (extra or {})}
103- self ._logger .error (msg , * args , extra = merged_extra )
111+ self ._log (self ._logger .error , msg , * args , extra = extra )
104112
105113 def exception (
106114 self , msg : object , * args : object , extra : Mapping [str , object ] | None = None
107115 ) -> None :
116+ self ._log (self ._logger .exception , msg , * args , extra = extra )
117+
118+ def _log (
119+ self ,
120+ log_func : Callable ,
121+ msg : object ,
122+ * args : object ,
123+ extra : Mapping [str , object ] | None = None ,
124+ ):
125+ if not self ._should_log ():
126+ return
108127 merged_extra = {** self ._default_extra , ** (extra or {})}
109- self ._logger .exception (msg , * args , extra = merged_extra )
128+ log_func (msg , * args , extra = merged_extra )
129+
130+ def _should_log (self ) -> bool :
131+ return not self ._execution_state .is_replaying ()
0 commit comments