@@ -120,6 +120,29 @@ def __init__(
120
120
keys_combined = {** self ._build_default_keys (), ** kwargs }
121
121
self .log_format .update (** keys_combined )
122
122
123
+ def format (self , record : logging .LogRecord ) -> str : # noqa: A003
124
+ """Format logging record as structured JSON str"""
125
+ formatted_log = self ._extract_log_keys (log_record = record )
126
+ formatted_log ["message" ] = self ._extract_log_message (log_record = record )
127
+ formatted_log ["exception" ], formatted_log ["exception_name" ] = self ._extract_log_exception (log_record = record )
128
+ formatted_log ["xray_trace_id" ] = self ._get_latest_trace_id ()
129
+ formatted_log = self ._strip_none_records (records = formatted_log )
130
+
131
+ return self .json_serializer (formatted_log )
132
+
133
+ def formatTime (self , record : logging .LogRecord , datefmt : Optional [str ] = None ) -> str :
134
+ # NOTE: Pyhton time.strftime doesn't provide msec directives
135
+ # so we create a custom one (%F) and replace logging record ts
136
+ # Reason 2 is that std logging doesn't support msec after TZ
137
+ record_ts = self .converter (record .created )
138
+ if datefmt :
139
+ ts_formatted = time .strftime (datefmt , record_ts )
140
+ else :
141
+ msec = "%03d" % record .msecs
142
+ custom_fmt = self .default_time_format .replace (self .custom_ms_time_directive , msec )
143
+ ts_formatted = time .strftime (custom_fmt , record_ts )
144
+ return ts_formatted
145
+
123
146
def append_keys (self , ** additional_keys ):
124
147
self .log_format .update (additional_keys )
125
148
@@ -218,27 +241,5 @@ def _strip_none_records(records: Dict[str, Any]) -> Dict[str, Any]:
218
241
"""Remove any key with None as value"""
219
242
return {k : v for k , v in records .items () if v is not None }
220
243
221
- def format (self , record ): # noqa: A003
222
- formatted_log = self ._extract_log_keys (log_record = record )
223
- formatted_log ["message" ] = self ._extract_log_message (log_record = record )
224
- formatted_log ["exception" ], formatted_log ["exception_name" ] = self ._extract_log_exception (log_record = record )
225
- formatted_log ["xray_trace_id" ] = self ._get_latest_trace_id ()
226
- formatted_log = self ._strip_none_records (records = formatted_log )
227
-
228
- return self .json_serializer (formatted_log )
229
-
230
- def formatTime (self , record : logging .LogRecord , datefmt : Optional [str ] = None ) -> str :
231
- # NOTE: Pyhton time.strftime doesn't provide msec directives
232
- # so we create a custom one (%F) and replace logging record ts
233
- # Reason 2 is that std logging doesn't support msec after TZ
234
- record_ts = self .converter (record .created )
235
- if datefmt :
236
- ts_formatted = time .strftime (datefmt , record_ts )
237
- else :
238
- msec = "%03d" % record .msecs
239
- custom_fmt = self .default_time_format .replace (self .custom_ms_time_directive , msec )
240
- ts_formatted = time .strftime (custom_fmt , record_ts )
241
- return ts_formatted
242
-
243
244
244
245
JsonFormatter = LambdaPowertoolsFormatter # alias to previous formatter
0 commit comments