Skip to content

Commit 802bc41

Browse files
authored
feat(logger): introduce POWERTOOLS_DEBUG for internal debugging (#1572)
1 parent e09fbc6 commit 802bc41

File tree

6 files changed

+99
-12
lines changed

6 files changed

+99
-12
lines changed
+19-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,25 @@
11
import logging
22

3+
from aws_lambda_powertools.logging.logger import set_package_logger
4+
from aws_lambda_powertools.shared.functions import powertools_debug_is_set
5+
6+
7+
def set_package_logger_handler(stream=None):
8+
"""Sets up Lambda Powertools package logging.
9+
10+
By default, we discard any output to not interfere with customers logging.
11+
12+
When POWERTOOLS_DEBUG env var is set, we setup `aws_lambda_powertools` logger in DEBUG level.
13+
14+
Parameters
15+
----------
16+
stream: sys.stdout
17+
log stream, stdout by default
18+
"""
19+
20+
if powertools_debug_is_set():
21+
return set_package_logger(stream=stream)
322

4-
def set_package_logger_handler():
523
logger = logging.getLogger("aws_lambda_powertools")
624
logger.addHandler(logging.NullHandler())
725
logger.propagate = False

aws_lambda_powertools/shared/constants.py

+2
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,6 @@
3636
# JSON indentation level
3737
PRETTY_INDENT: int = 4
3838
COMPACT_INDENT = None
39+
3940
POWERTOOLS_DEV_ENV: str = "POWERTOOLS_DEV"
41+
POWERTOOLS_DEBUG_ENV: str = "POWERTOOLS_DEBUG"

aws_lambda_powertools/shared/functions.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ def strtobool(value: str) -> bool:
2020
> note:: Copied from distutils.util.
2121
"""
2222
value = value.lower()
23-
if value in ("y", "yes", "t", "true", "on", "1"):
23+
if value in ("1", "y", "yes", "t", "true", "on"):
2424
return True
25-
if value in ("n", "no", "f", "false", "off", "0"):
25+
if value in ("0", "n", "no", "f", "false", "off"):
2626
return False
2727
raise ValueError(f"invalid truth value {value!r}")
2828

@@ -91,3 +91,12 @@ def powertools_dev_is_set() -> bool:
9191
return True
9292

9393
return False
94+
95+
96+
def powertools_debug_is_set() -> bool:
97+
is_on = strtobool(os.getenv(constants.POWERTOOLS_DEBUG_ENV, "0"))
98+
if is_on:
99+
warnings.warn("POWERTOOLS_DEBUG environment variable is enabled. Setting logging level to DEBUG.")
100+
return True
101+
102+
return False

docs/index.md

+2-8
Original file line numberDiff line numberDiff line change
@@ -454,15 +454,9 @@ Core utilities such as Tracing, Logging, Metrics, and Event Handler will be avai
454454

455455
## Debug mode
456456

457-
As a best practice, AWS Lambda Powertools module logging statements are suppressed. If necessary, you can enable debugging using `set_package_logger` for additional information on every internal operation:
457+
As a best practice for libraries, AWS Lambda Powertools module logging statements are suppressed.
458458

459-
```python title="Powertools debug mode example"
460-
from aws_lambda_powertools.logging.logger import set_package_logger
461-
462-
set_package_logger() # (1)
463-
```
464-
465-
1. :information_source: this will configure our `aws_lambda_powertools` logger with debug.
459+
When necessary, you can use `POWERTOOLS_DEBUG` environment variable to enable debugging. This will provide additional information on every internal operation.
466460

467461
## Tenets
468462

tests/functional/test_logger.py

+32-1
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@
55
import random
66
import re
77
import string
8+
import warnings
89
from ast import Dict
910
from collections import namedtuple
1011
from datetime import datetime, timezone
1112
from typing import Any, Callable, Iterable, List, Optional, Union
1213

1314
import pytest
1415

15-
from aws_lambda_powertools import Logger, Tracer
16+
from aws_lambda_powertools import Logger, Tracer, set_package_logger_handler
1617
from aws_lambda_powertools.logging import correlation_paths
1718
from aws_lambda_powertools.logging.exceptions import InvalidLoggerSamplingRateError
1819
from aws_lambda_powertools.logging.formatter import (
@@ -827,3 +828,33 @@ def handler(event, context, planet, str_end="."):
827828
log = capture_logging_output(stdout)
828829

829830
assert log["message"] == "Hello World!"
831+
832+
833+
def test_set_package_logger_handler_with_powertools_debug_env_var(stdout, monkeypatch: pytest.MonkeyPatch):
834+
# GIVEN POWERTOOLS_DEBUG is set
835+
monkeypatch.setenv(constants.POWERTOOLS_DEBUG_ENV, "1")
836+
logger = logging.getLogger("aws_lambda_powertools")
837+
838+
# WHEN set_package_logger is used at initialization
839+
# and any Powertools operation is used (e.g., Tracer)
840+
set_package_logger_handler(stream=stdout)
841+
Tracer(disabled=True)
842+
843+
# THEN Tracer debug log statement should be logged
844+
output = stdout.getvalue()
845+
assert "Tracing has been disabled" in output
846+
assert logger.level == logging.DEBUG
847+
848+
849+
def test_powertools_debug_env_var_warning(monkeypatch: pytest.MonkeyPatch):
850+
# GIVEN POWERTOOLS_DEBUG is set
851+
monkeypatch.setenv(constants.POWERTOOLS_DEBUG_ENV, "1")
852+
warning_message = "POWERTOOLS_DEBUG environment variable is enabled. Setting logging level to DEBUG."
853+
854+
# WHEN set_package_logger is used at initialization
855+
# THEN a warning should be emitted
856+
with warnings.catch_warnings(record=True) as w:
857+
warnings.simplefilter("default")
858+
set_package_logger_handler()
859+
assert len(w) == 1
860+
assert str(w[0].message) == warning_message

tests/functional/test_shared_functions.py

+33
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
import warnings
2+
13
import pytest
24

5+
from aws_lambda_powertools.shared import constants
36
from aws_lambda_powertools.shared.functions import (
7+
powertools_debug_is_set,
8+
powertools_dev_is_set,
49
resolve_env_var_choice,
510
resolve_truthy_env_var_choice,
611
strtobool,
@@ -31,3 +36,31 @@ def test_strtobool_value_error():
3136
with pytest.raises(ValueError) as exp:
3237
strtobool("fail")
3338
assert str(exp.value) == "invalid truth value 'fail'"
39+
40+
41+
def test_powertools_dev_warning(monkeypatch: pytest.MonkeyPatch):
42+
# GIVEN POWERTOOLS_DEBUG is set
43+
monkeypatch.setenv(constants.POWERTOOLS_DEV_ENV, "1")
44+
warning_message = "POWERTOOLS_DEV environment variable is enabled. Increasing verbosity across utilities."
45+
46+
# WHEN set_package_logger is used at initialization
47+
# THEN a warning should be emitted
48+
with warnings.catch_warnings(record=True) as w:
49+
warnings.simplefilter("default")
50+
powertools_dev_is_set()
51+
assert len(w) == 1
52+
assert str(w[0].message) == warning_message
53+
54+
55+
def test_powertools_debug_warning(monkeypatch: pytest.MonkeyPatch):
56+
# GIVEN POWERTOOLS_DEBUG is set
57+
monkeypatch.setenv(constants.POWERTOOLS_DEBUG_ENV, "1")
58+
warning_message = "POWERTOOLS_DEBUG environment variable is enabled. Setting logging level to DEBUG."
59+
60+
# WHEN set_package_logger is used at initialization
61+
# THEN a warning should be emitted
62+
with warnings.catch_warnings(record=True) as w:
63+
warnings.simplefilter("default")
64+
powertools_debug_is_set()
65+
assert len(w) == 1
66+
assert str(w[0].message) == warning_message

0 commit comments

Comments
 (0)