@@ -221,7 +221,7 @@ def __init__(
221
221
utc : bool = False ,
222
222
use_rfc3339 : bool = False ,
223
223
** kwargs ,
224
- ):
224
+ ) -> None :
225
225
self .service = resolve_env_var_choice (
226
226
choice = service ,
227
227
env = os .getenv (constants .SERVICE_NAME_ENV , "service_undefined" ),
@@ -270,15 +270,20 @@ def __getattr__(self, name):
270
270
# https://github.com/aws-powertools/powertools-lambda-python/issues/97
271
271
return getattr (self ._logger , name )
272
272
273
- def _get_logger (self ):
273
+ def _get_logger (self ) -> logging . Logger :
274
274
"""Returns a Logger named {self.service}, or {self.service.filename} for child loggers"""
275
275
logger_name = self .service
276
276
if self .child :
277
277
logger_name = f"{ self .service } .{ _get_caller_filename ()} "
278
278
279
279
return logging .getLogger (logger_name )
280
280
281
- def _init_logger (self , formatter_options : Optional [Dict ] = None , log_level : Union [str , int , None ] = None , ** kwargs ):
281
+ def _init_logger (
282
+ self ,
283
+ formatter_options : Optional [Dict ] = None ,
284
+ log_level : Union [str , int , None ] = None ,
285
+ ** kwargs ,
286
+ ) -> None :
282
287
"""Configures new logger"""
283
288
284
289
# Skip configuration if it's a child logger or a pre-configured logger
@@ -296,7 +301,7 @@ def _init_logger(self, formatter_options: Optional[Dict] = None, log_level: Unio
296
301
self .structure_logs (formatter_options = formatter_options , ** kwargs )
297
302
298
303
# Maintenance: We can drop this upon Py3.7 EOL. It's a backport for "location" key to work
299
- self ._logger .findCaller = compat .findCaller
304
+ self ._logger .findCaller = compat .findCaller # type: ignore[method-assign]
300
305
301
306
# Pytest Live Log feature duplicates log records for colored output
302
307
# but we explicitly add a filter for log deduplication.
@@ -313,9 +318,9 @@ def _init_logger(self, formatter_options: Optional[Dict] = None, log_level: Unio
313
318
# therefore we set a custom attribute in the Logger that will be returned
314
319
# std logging will return the same Logger with our attribute if name is reused
315
320
logger .debug (f"Marking logger { self .service } as preconfigured" )
316
- self ._logger .init = True
321
+ self ._logger .init = True # type: ignore[attr-defined]
317
322
318
- def _configure_sampling (self ):
323
+ def _configure_sampling (self ) -> None :
319
324
"""Dynamically set log level based on sampling rate
320
325
321
326
Raises
@@ -329,8 +334,10 @@ def _configure_sampling(self):
329
334
self ._logger .setLevel (logging .DEBUG )
330
335
except ValueError :
331
336
raise InvalidLoggerSamplingRateError (
332
- f"Expected a float value ranging 0 to 1, but received { self .sampling_rate } instead."
333
- f"Please review POWERTOOLS_LOGGER_SAMPLE_RATE environment variable." ,
337
+ (
338
+ f"Expected a float value ranging 0 to 1, but received { self .sampling_rate } instead."
339
+ "Please review POWERTOOLS_LOGGER_SAMPLE_RATE environment variable."
340
+ ),
334
341
)
335
342
336
343
@overload
@@ -452,7 +459,7 @@ def info(
452
459
stacklevel : int = 2 ,
453
460
extra : Optional [Mapping [str , object ]] = None ,
454
461
** kwargs ,
455
- ):
462
+ ) -> None :
456
463
extra = extra or {}
457
464
extra = {** extra , ** kwargs }
458
465
@@ -477,7 +484,7 @@ def error(
477
484
stacklevel : int = 2 ,
478
485
extra : Optional [Mapping [str , object ]] = None ,
479
486
** kwargs ,
480
- ):
487
+ ) -> None :
481
488
extra = extra or {}
482
489
extra = {** extra , ** kwargs }
483
490
@@ -502,7 +509,7 @@ def exception(
502
509
stacklevel : int = 2 ,
503
510
extra : Optional [Mapping [str , object ]] = None ,
504
511
** kwargs ,
505
- ):
512
+ ) -> None :
506
513
extra = extra or {}
507
514
extra = {** extra , ** kwargs }
508
515
@@ -527,7 +534,7 @@ def critical(
527
534
stacklevel : int = 2 ,
528
535
extra : Optional [Mapping [str , object ]] = None ,
529
536
** kwargs ,
530
- ):
537
+ ) -> None :
531
538
extra = extra or {}
532
539
extra = {** extra , ** kwargs }
533
540
@@ -552,7 +559,7 @@ def warning(
552
559
stacklevel : int = 2 ,
553
560
extra : Optional [Mapping [str , object ]] = None ,
554
561
** kwargs ,
555
- ):
562
+ ) -> None :
556
563
extra = extra or {}
557
564
extra = {** extra , ** kwargs }
558
565
@@ -577,7 +584,7 @@ def debug(
577
584
stacklevel : int = 2 ,
578
585
extra : Optional [Mapping [str , object ]] = None ,
579
586
** kwargs ,
580
- ):
587
+ ) -> None :
581
588
extra = extra or {}
582
589
extra = {** extra , ** kwargs }
583
590
@@ -593,13 +600,13 @@ def debug(
593
600
extra = extra ,
594
601
)
595
602
596
- def append_keys (self , ** additional_keys ):
603
+ def append_keys (self , ** additional_keys ) -> None :
597
604
self .registered_formatter .append_keys (** additional_keys )
598
605
599
- def remove_keys (self , keys : Iterable [str ]):
606
+ def remove_keys (self , keys : Iterable [str ]) -> None :
600
607
self .registered_formatter .remove_keys (keys )
601
608
602
- def structure_logs (self , append : bool = False , formatter_options : Optional [Dict ] = None , ** keys ):
609
+ def structure_logs (self , append : bool = False , formatter_options : Optional [Dict ] = None , ** keys ) -> None :
603
610
"""Sets logging formatting to JSON.
604
611
605
612
Optionally, it can append keyword arguments
@@ -645,7 +652,7 @@ def structure_logs(self, append: bool = False, formatter_options: Optional[Dict]
645
652
self .registered_formatter .clear_state ()
646
653
self .registered_formatter .append_keys (** log_keys )
647
654
648
- def set_correlation_id (self , value : Optional [str ]):
655
+ def set_correlation_id (self , value : Optional [str ]) -> None :
649
656
"""Sets the correlation_id in the logging json
650
657
651
658
Parameters
@@ -676,7 +683,9 @@ def addHandler(self, handler: logging.Handler) -> None:
676
683
@property
677
684
def registered_handler (self ) -> logging .Handler :
678
685
"""Convenience property to access the first logger handler"""
679
- handlers = self ._logger .parent .handlers if self .child else self ._logger .handlers
686
+ # We ignore mypy here because self.child encodes whether or not self._logger.parent is
687
+ # None, mypy can't see this from context but we can
688
+ handlers = self ._logger .parent .handlers if self .child else self ._logger .handlers # type: ignore[union-attr]
680
689
return handlers [0 ]
681
690
682
691
@property
@@ -720,7 +729,7 @@ def set_package_logger(
720
729
level : Union [str , int ] = logging .DEBUG ,
721
730
stream : Optional [IO [str ]] = None ,
722
731
formatter : Optional [logging .Formatter ] = None ,
723
- ):
732
+ ) -> None :
724
733
"""Set an additional stream handler, formatter, and log level for aws_lambda_powertools package logger.
725
734
726
735
**Package log by default is suppressed (NullHandler), this should only used for debugging.
@@ -755,16 +764,18 @@ def set_package_logger(
755
764
logger .addHandler (handler )
756
765
757
766
758
- def log_uncaught_exception_hook (exc_type , exc_value , exc_traceback , logger : Logger ):
767
+ def log_uncaught_exception_hook (exc_type , exc_value , exc_traceback , logger : Logger ) -> None :
759
768
"""Callback function for sys.excepthook to use Logger to log uncaught exceptions"""
760
769
logger .exception (exc_value , exc_info = (exc_type , exc_value , exc_traceback )) # pragma: no cover
761
770
762
771
763
- def _get_caller_filename ():
772
+ def _get_caller_filename () -> str :
764
773
"""Return caller filename by finding the caller frame"""
765
774
# Current frame => _get_logger()
766
775
# Previous frame => logger.py
767
776
# Before previous frame => Caller
777
+ # We ignore mypy here because *we* know that there will always be at least
778
+ # 3 frames (above) so repeatedly calling f_back is safe here
768
779
frame = inspect .currentframe ()
769
- caller_frame = frame .f_back .f_back .f_back
770
- return caller_frame .f_globals ["__name__" ]
780
+ caller_frame = frame .f_back .f_back .f_back # type: ignore[union-attr]
781
+ return caller_frame .f_globals ["__name__" ] # type: ignore[union-attr]
0 commit comments