Skip to content

Commit 077ff1e

Browse files
committed
chore(logging): make log injection config a boolean
1 parent e0a772c commit 077ff1e

File tree

9 files changed

+29
-32
lines changed

9 files changed

+29
-32
lines changed

ddtrace/_logger.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class LogInjectionState(object):
2020
# Log injection is enabled, but not yet configured
2121
ENABLED = "true"
2222
# Log injection is enabled and configured for structured logging
23+
# This value is deprecated, but kept for backwards compatibility
2324
STRUCTURED = "structured"
2425

2526

@@ -109,17 +110,15 @@ def set_log_formatting():
109110
handler.setFormatter(logging.Formatter(DD_LOG_FORMAT))
110111

111112

112-
def get_log_injection_state(raw_config: Optional[str]) -> str:
113+
def get_log_injection_state(raw_config: Optional[str]) -> bool:
113114
"""Returns the current log injection state."""
114115
if raw_config:
115116
normalized = raw_config.lower().strip()
116-
if normalized == LogInjectionState.STRUCTURED:
117-
return LogInjectionState.STRUCTURED
118-
elif normalized in ("true", "1"):
119-
return LogInjectionState.ENABLED
117+
if normalized == LogInjectionState.STRUCTURED or normalized in ("true", "1"):
118+
return True
120119
elif normalized not in ("false", "0"):
121120
logging.warning(
122121
"Invalid log injection state '%s'. Expected 'true', 'false', or 'structured'. Defaulting to 'false'.",
123122
normalized,
124123
)
125-
return LogInjectionState.DISABLED
124+
return False

ddtrace/contrib/internal/logbook/patch.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
import ddtrace
77
from ddtrace import config
8-
from ddtrace._logger import LogInjectionState
98
from ddtrace.contrib.internal.trace_utils import unwrap as _u
109
from ddtrace.internal.utils import get_argument_value
1110

@@ -27,7 +26,7 @@ def _supported_versions() -> Dict[str, str]:
2726

2827
def _w_process_record(func, instance, args, kwargs):
2928
# patch logger to include datadog info before logging
30-
if config._logs_injection != LogInjectionState.DISABLED:
29+
if config._logs_injection:
3130
record = get_argument_value(args, kwargs, 0, "record")
3231
record.extra.update(ddtrace.tracer.get_log_correlation_context())
3332
return func(*args, **kwargs)

ddtrace/contrib/internal/logging/patch.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
import ddtrace
77
from ddtrace import config
8-
from ddtrace._logger import LogInjectionState
98
from ddtrace._logger import set_log_formatting
109
from ddtrace.contrib.internal.trace_utils import unwrap as _u
1110
from ddtrace.internal.constants import LOG_ATTR_ENV
@@ -54,15 +53,13 @@ def __init__(self, trace_id: int, span_id: int, service: str, version: str, env:
5453
def _w_makeRecord(func, instance, args, kwargs):
5554
# Get the LogRecord instance for this log
5655
record = func(*args, **kwargs)
57-
if config._logs_injection == LogInjectionState.DISABLED:
58-
# log injection is opt-in for non-structured logging
59-
return record
60-
record.__dict__.update(ddtrace.tracer.get_log_correlation_context())
56+
if config._logs_injection:
57+
record.__dict__.update(ddtrace.tracer.get_log_correlation_context())
6158
return record
6259

6360

6461
def _w_StrFormatStyle_format(func, instance, args, kwargs):
65-
if config._logs_injection != LogInjectionState.ENABLED:
62+
if not config._logs_injection:
6663
return func(*args, **kwargs)
6764
# The format string "dd.service={dd.service}" expects
6865
# the record to have a "dd" property which is an object that
@@ -103,7 +100,7 @@ def patch():
103100
_w(logging.Logger, "makeRecord", _w_makeRecord)
104101
_w(logging.StrFormatStyle, "_format", _w_StrFormatStyle_format)
105102

106-
if config._logs_injection == LogInjectionState.ENABLED:
103+
if config._logs_injection:
107104
# Only set the formatter is DD_LOGS_INJECTION is set to True. We do not want to modify
108105
# unstructured logs if a user has not enabled logs injection.
109106
# Also, the Datadog log format must be set after the logging module has been patched,

ddtrace/contrib/internal/loguru/patch.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
import ddtrace
77
from ddtrace import config
8-
from ddtrace._logger import LogInjectionState
98
from ddtrace.contrib.internal.trace_utils import unwrap as _u
109

1110

@@ -25,12 +24,11 @@ def _supported_versions() -> Dict[str, str]:
2524

2625

2726
def _tracer_injection(event_dict):
28-
if config._logs_injection == LogInjectionState.DISABLED:
27+
if not config._logs_injection:
2928
# log injection is opt-out for structured logging
3029
return event_dict
3130
event_dd_attributes = ddtrace.tracer.get_log_correlation_context()
3231
event_dict.update(event_dd_attributes)
33-
3432
return event_dd_attributes
3533

3634

ddtrace/contrib/internal/structlog/patch.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import ddtrace
66
from ddtrace import config
7-
from ddtrace._logger import LogInjectionState
87
from ddtrace.contrib.internal.trace_utils import unwrap as _u
98
from ddtrace.contrib.internal.trace_utils import wrap as _w
109
from ddtrace.internal.utils import get_argument_value
@@ -27,9 +26,8 @@ def _supported_versions() -> Dict[str, str]:
2726

2827

2928
def _tracer_injection(_, __, event_dict):
30-
if config._logs_injection == LogInjectionState.DISABLED:
31-
return event_dict
32-
event_dict.update(ddtrace.tracer.get_log_correlation_context())
29+
if config._logs_injection:
30+
event_dict.update(ddtrace.tracer.get_log_correlation_context())
3331
return event_dict
3432

3533

ddtrace/settings/_config.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
from ddtrace.internal.telemetry import validate_otel_envs
1818
from ddtrace.internal.utils.cache import cachedmethod
1919

20-
from .._logger import LogInjectionState
2120
from .._logger import get_log_injection_state
2221
from ..internal import gitmetadata
2322
from ..internal.constants import _PROPAGATION_BEHAVIOR_DEFAULT
@@ -365,7 +364,7 @@ def _default_config() -> Dict[str, _ConfigItem]:
365364
modifier=str,
366365
),
367366
"_logs_injection": _ConfigItem(
368-
default=LogInjectionState.STRUCTURED,
367+
default=True,
369368
envs=["DD_LOGS_INJECTION"],
370369
modifier=get_log_injection_state,
371370
),

tests/contrib/logging/test_tracer_logging.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55

66

77
# example: '2022-06-10 21:49:26,010 CRITICAL [ddtrace] [test.py:15] - ddtrace critical log\n'
8-
LOG_PATTERN = r"^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} \w{1,} \[\S{1,}\] \[\w{1,}.\w{2}:\d{1,}\] - .{1,}$"
8+
# example: '2025-07-16 16:27:02,708 CRITICAL [ddtrace] [test.py:8] [dd.service=ddtrace_subprocess_dir
9+
# dd.env= dd.version= dd.trace_id=0 dd.span_id=0] - ddtrace critical log\n'
10+
LOG_PATTERN = (
11+
r"^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2},\d{3} \w{1,} \[\S{1,}\] \[\w{1,}\.\w{2}:\d{1,}\]( \[.*\])? - .{1,}$"
12+
)
913

1014

1115
def assert_log_files(test_directory, test_log_file, total_file_count):
@@ -246,7 +250,7 @@ def test_warn_logs_can_go_to_file(run_python_code_in_subprocess, ddtrace_run_pyt
246250
]:
247251
out, err, status, pid = run_in_subprocess(code, env=env)
248252
assert status == 0, err
249-
assert err == b"warning log\n", err.decode()
253+
assert b"warning log\n" in err, err.decode()
250254
assert out == b"", out.decode()
251255
with open(log_file) as file:
252256
first_line = file.readline()

tests/contrib/starlette/test_starlette.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ def test_incorrect_patching(run_python_code_in_subprocess):
520520
out, err, status, _ = run_python_code_in_subprocess(code)
521521
assert status == 0, err
522522
assert out == b"", err
523-
assert err == b"datadog context not present in ASGI request scope, trace middleware may be missing\n"
523+
assert b"datadog context not present in ASGI request scope, trace middleware may be missing\n" in err, err
524524

525525

526526
# Ignoring span link attributes until values are

tests/tracer/test_settings.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import pytest
44

5-
from ddtrace._logger import LogInjectionState
65
from ddtrace.settings import HttpConfig
76
from ddtrace.settings import IntegrationConfig
87
from ddtrace.settings._config import Config
@@ -14,20 +13,24 @@ class TestConfig(BaseTestCase):
1413
def test_logs_injection(self):
1514
with self.override_env(dict(DD_LOGS_INJECTION="True")):
1615
config = Config()
17-
self.assertEqual(config._logs_injection, LogInjectionState.ENABLED)
16+
self.assertEqual(config._logs_injection, True)
1817

1918
with self.override_env(dict(DD_LOGS_INJECTION="FALSE")):
2019
config = Config()
21-
self.assertEqual(config._logs_injection, LogInjectionState.DISABLED)
20+
self.assertEqual(config._logs_injection, False)
21+
22+
with self.override_env(dict(DD_LOGS_INJECTION="structured")):
23+
config = Config()
24+
self.assertEqual(config._logs_injection, False)
2225

2326
with self.override_env(dict(), replace_os_env=True):
2427
config = Config()
25-
self.assertEqual(config._logs_injection, LogInjectionState.STRUCTURED)
28+
self.assertEqual(config._logs_injection, True)
2629

2730
with self.override_env(dict(DD_LOGS_INJECTION="nonsense")):
2831
# If the value is not recognized, it should default to DISABLED
2932
config = Config()
30-
self.assertEqual(config._logs_injection, LogInjectionState.DISABLED)
33+
self.assertEqual(config._logs_injection, False)
3134

3235
def test_service(self):
3336
# If none is provided the default should be ``None``

0 commit comments

Comments
 (0)