4
4
import os
5
5
import random
6
6
import sys
7
- from typing import Any , Callable , Dict , Optional , Union
7
+ from typing import Any , Callable , Dict , Iterable , Optional , Union
8
8
9
9
import jmespath
10
10
@@ -42,6 +42,7 @@ def _is_cold_start() -> bool:
42
42
# so we need to return to subclassing removed in #97
43
43
# All methods/properties continue to be proxied to inner logger
44
44
# https://github.com/awslabs/aws-lambda-powertools-python/issues/107
45
+ # noinspection PyRedeclaration
45
46
class Logger (logging .Logger ): # lgtm [py/missing-call-to-init]
46
47
"""Creates and setups a logger to format statements in JSON.
47
48
@@ -96,7 +97,7 @@ class Logger(logging.Logger): # lgtm [py/missing-call-to-init]
96
97
>>> logger = Logger(service="payment")
97
98
>>>
98
99
>>> def handler(event, context):
99
- logger.structure_logs(append=True, payment_id=event["payment_id"])
100
+ logger.append_keys( payment_id=event["payment_id"])
100
101
logger.info("Hello")
101
102
102
103
**Create child Logger using logging inheritance via child param**
@@ -139,6 +140,7 @@ def __init__(
139
140
self ._handler = logging .StreamHandler (stream ) or logging .StreamHandler (sys .stdout )
140
141
self ._default_log_keys = {"service" : self .service , "sampling_rate" : self .sampling_rate }
141
142
self ._logger = self ._get_logger ()
143
+
142
144
self ._init_logger (** kwargs )
143
145
144
146
def __getattr__ (self , name ):
@@ -282,12 +284,28 @@ def decorate(event, context):
282
284
283
285
return decorate
284
286
285
- def structure_logs (self , append : bool = False , ** kwargs ):
287
+ def append_keys (self , ** additional_keys ):
288
+ self .registered_formatter .append_keys (** additional_keys )
289
+
290
+ def remove_keys (self , keys : Iterable [str ]):
291
+ self .registered_formatter .remove_keys (keys )
292
+
293
+ @property
294
+ def registered_handler (self ) -> logging .Handler :
295
+ """Registered Logger handler"""
296
+ handlers = self ._logger .parent .handlers if self .child else self ._logger .handlers
297
+ return handlers [0 ]
298
+
299
+ @property
300
+ def registered_formatter (self ) -> Optional [LambdaPowertoolsFormatter ]:
301
+ """Registered Logger formatter"""
302
+ return self .registered_handler .formatter
303
+
304
+ def structure_logs (self , append : bool = False , ** keys ):
286
305
"""Sets logging formatting to JSON.
287
306
288
307
Optionally, it can append keyword arguments
289
- to an existing logger so it is available
290
- across future log statements.
308
+ to an existing logger so it is available across future log statements.
291
309
292
310
Last keyword argument and value wins if duplicated.
293
311
@@ -297,15 +315,12 @@ def structure_logs(self, append: bool = False, **kwargs):
297
315
[description], by default False
298
316
"""
299
317
300
- # Child loggers don't have handlers attached, use its parent handlers
301
- handlers = self ._logger .parent .handlers if self .child else self ._logger .handlers
302
- for handler in handlers :
303
- if append :
304
- # Update existing formatter in an existing logger handler
305
- handler .formatter .update_formatter (** kwargs )
306
- else :
307
- # Set a new formatter for a logger handler
308
- handler .setFormatter (LambdaPowertoolsFormatter (** self ._default_log_keys , ** kwargs ))
318
+ if append :
319
+ # Maintenance: Add deprecation warning for major version, refer to append_keys() when docs are updated
320
+ self .append_keys (** keys )
321
+ else :
322
+ # Set a new formatter for a logger handler
323
+ self .registered_handler .setFormatter (LambdaPowertoolsFormatter (** self ._default_log_keys , ** keys ))
309
324
310
325
def set_correlation_id (self , value : str ):
311
326
"""Sets the correlation_id in the logging json
0 commit comments