2
2
import itertools
3
3
import logging
4
4
import os
5
+ import random
5
6
from distutils .util import strtobool
6
7
from typing import Any , Callable , Dict
7
8
14
15
is_cold_start = True
15
16
16
17
17
- def logger_setup (service : str = "service_undefined" , level : str = "INFO" , ** kwargs ):
18
+ def logger_setup (
19
+ service : str = "service_undefined" , level : str = "INFO" , sampling_rate : float = 0.0 , ** kwargs
20
+ ):
18
21
"""Setups root logger to format statements in JSON.
19
22
20
23
Includes service name and any additional key=value into logs
@@ -26,13 +29,17 @@ def logger_setup(service: str = "service_undefined", level: str = "INFO", **kwar
26
29
service name
27
30
LOG_LEVEL: str
28
31
logging level (e.g. INFO, DEBUG)
32
+ POWERTOOLS_LOGGER_SAMPLE_RATE: float
33
+ samping rate ranging from 0 to 1, 1 being 100% sampling
29
34
30
35
Parameters
31
36
----------
32
37
service : str, optional
33
38
service name to be appended in logs, by default "service_undefined"
34
39
level : str, optional
35
40
logging.level, by default "INFO"
41
+ sample_rate: float, optional
42
+ sample rate for debug calls within execution context defaults to 0
36
43
37
44
Example
38
45
-------
@@ -47,6 +54,7 @@ def logger_setup(service: str = "service_undefined", level: str = "INFO", **kwar
47
54
Setups structured logging in JSON for Lambda functions using env vars
48
55
49
56
$ export POWERTOOLS_SERVICE_NAME="payment"
57
+ $ export POWERTOOLS_LOGGER_SAMPLE_RATE=0.01 # 1% debug sampling
50
58
>>> from aws_lambda_powertools.logging import logger_setup
51
59
>>> logger = logger_setup()
52
60
>>>
@@ -55,12 +63,24 @@ def logger_setup(service: str = "service_undefined", level: str = "INFO", **kwar
55
63
56
64
"""
57
65
service = os .getenv ("POWERTOOLS_SERVICE_NAME" ) or service
66
+ sampling_rate = os .getenv ("POWERTOOLS_LOGGER_SAMPLE_RATE" ) or sampling_rate
58
67
log_level = os .getenv ("LOG_LEVEL" ) or level
59
68
logger = logging .getLogger (name = service )
69
+
70
+ try :
71
+ if sampling_rate and random .random () <= float (sampling_rate ):
72
+ log_level = logging .DEBUG
73
+ except ValueError :
74
+ raise ValueError (
75
+ f"Expected a float value ranging 0 to 1, but received { sampling_rate } instead. Please review POWERTOOLS_LOGGER_SAMPLE_RATE environment variable."
76
+ )
77
+
60
78
logger .setLevel (log_level )
61
79
62
80
# Patch logger by structuring its outputs as JSON
63
- aws_lambda_logging .setup (level = log_level , service = service , ** kwargs )
81
+ aws_lambda_logging .setup (
82
+ level = log_level , service = service , sampling_rate = sampling_rate , ** kwargs
83
+ )
64
84
65
85
return logger
66
86
0 commit comments