Skip to content

Commit a5077e5

Browse files
committed
Prevent function crash when setting unknown log level.
1 parent b9f8c0f commit a5077e5

File tree

3 files changed

+63
-4
lines changed

3 files changed

+63
-4
lines changed

datadog_lambda/__init__.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import os
2-
import logging
31
from datadog_lambda.cold_start import initialize_cold_start_tracing
2+
from datadog_lambda.logger import initialize_logging
43

54
initialize_cold_start_tracing()
65

@@ -13,5 +12,4 @@
1312

1413
__version__ = importlib_metadata.version(__name__)
1514

16-
logger = logging.getLogger(__name__)
17-
logger.setLevel(logging.getLevelName(os.environ.get("DD_LOG_LEVEL", "INFO").upper()))
15+
initialize_logging(__name__)

datadog_lambda/logger.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import logging
2+
import os
3+
4+
_level_mappping = logging.getLevelNamesMapping()
5+
_level_mappping.update({
6+
# https://docs.datadoghq.com/agent/troubleshooting/debug_mode/?tab=agentv6v7#agent-log-level
7+
"TRACE": 5,
8+
"WARN": logging.WARNING,
9+
"OFF": 100,
10+
})
11+
12+
def initialize_logging(name):
13+
logger = logging.getLogger(name)
14+
str_level = os.environ.get("DD_LOG_LEVEL", "INFO").upper() or "INFO"
15+
level = _level_mappping.get(str_level)
16+
if level is None:
17+
logger.setLevel(logging.INFO)
18+
logger.warning(
19+
"Invalid log level: %s Defaulting to INFO", str_level
20+
)
21+
else:
22+
logger.setLevel(level)

tests/test_logger.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import io
2+
import logging
3+
import pytest
4+
5+
from datadog_lambda.logger import initialize_logging
6+
7+
_test_initialize_logging = (
8+
("TRACE", (10, 20, 30, 40, 50)),
9+
("DEBUG", (10, 20, 30, 40, 50)),
10+
("INFO", (20, 30, 40, 50)),
11+
("WARNING", (30, 40, 50)),
12+
("WARN", (30, 40, 50)),
13+
("ERROR", (40, 50)),
14+
("CRITICAL", (50,)),
15+
("OFF", ()),
16+
("", (20, 30, 40, 50)),
17+
("PURPLE", (30, 20, 30, 40, 50)), # log warning then default to INFO
18+
)
19+
20+
@pytest.mark.parametrize("level,logged_levels", _test_initialize_logging)
21+
def test_initialize_logging(level, logged_levels, monkeypatch):
22+
monkeypatch.setenv("DD_LOG_LEVEL", level)
23+
24+
stream = io.StringIO()
25+
handler = logging.StreamHandler(stream)
26+
handler.setFormatter(logging.Formatter("%(levelno)s"))
27+
logger = logging.getLogger(__name__)
28+
logger.addHandler(handler)
29+
30+
initialize_logging(__name__)
31+
32+
logger.debug("debug")
33+
logger.info("info")
34+
logger.warning("warning")
35+
logger.error("error")
36+
logger.critical("critical")
37+
38+
logged = tuple(map(int, stream.getvalue().strip().split()))
39+
assert logged == logged_levels

0 commit comments

Comments
 (0)