Skip to content

Commit d07b5c7

Browse files
chore(logging): remove log correlation attributes from ddtrace loggers [Take 2] [backport 3.16] (#15043)
Backport c1a6758 from #15036 to 3.16. Reverts #15027 Fixes failing test and suitespec: https://gitlab.ddbuild.io/DataDog/apm-reliability/dd-trace-py/-/pipelines/80160879 Co-authored-by: Munir Abdinur <[email protected]>
1 parent 2aa6d34 commit d07b5c7

File tree

7 files changed

+32
-31
lines changed

7 files changed

+32
-31
lines changed

ddtrace/_logger.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -110,14 +110,6 @@ def _add_file_handler(
110110
return ddtrace_file_handler
111111

112112

113-
def set_log_formatting():
114-
# type: () -> None
115-
"""Sets the log format for the ddtrace logger."""
116-
ddtrace_logger = logging.getLogger("ddtrace")
117-
for handler in ddtrace_logger.handlers:
118-
handler.setFormatter(logging.Formatter(DD_LOG_FORMAT))
119-
120-
121113
def get_log_injection_state(raw_config: Optional[str]) -> bool:
122114
"""Returns the current log injection state."""
123115
if raw_config:

ddtrace/contrib/internal/logging/patch.py

Lines changed: 0 additions & 8 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 set_log_formatting
98
from ddtrace.contrib.internal.trace_utils import unwrap as _u
109
from ddtrace.internal.constants import LOG_ATTR_ENV
1110
from ddtrace.internal.constants import LOG_ATTR_SERVICE
@@ -100,13 +99,6 @@ def patch():
10099
_w(logging.Logger, "makeRecord", _w_makeRecord)
101100
_w(logging.StrFormatStyle, "_format", _w_StrFormatStyle_format)
102101

103-
if config._logs_injection:
104-
# Only set the formatter is DD_LOGS_INJECTION is set to True. We do not want to modify
105-
# unstructured logs if a user has not enabled logs injection.
106-
# Also, the Datadog log format must be set after the logging module has been patched,
107-
# otherwise the formatter will raise an exception.
108-
set_log_formatting()
109-
110102

111103
def unpatch():
112104
if getattr(logging, "_datadog_patch", False):
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
fixes:
3+
- |
4+
logging: Fixed ddtrace internal logging when trace-log correlation is disabled.
5+
Prevents ``ValueError: Formatting field not found in record: 'dd.service'``.
Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,28 @@
1+
from io import StringIO
2+
import json
13
import logging
24

35

6+
class JSONFormatter(logging.Formatter):
7+
"""Custom formatter that outputs log records as JSON."""
8+
9+
def format(self, record):
10+
return json.dumps({k: str(v) for k, v in record.__dict__.items()})
11+
12+
413
if __name__ == "__main__":
5-
# Ensure if module is patched then default log formatter is set up for logs
6-
ddtrace_logger = logging.getLogger("ddtrace")
7-
if logging._datadog_patch:
8-
assert (
9-
"[dd.service=%(dd.service)s dd.env=%(dd.env)s dd.version=%(dd.version)s"
10-
" dd.trace_id=%(dd.trace_id)s dd.span_id=%(dd.span_id)s]" in ddtrace_logger.handlers[0].formatter._fmt
11-
)
12-
else:
13-
assert (
14-
"[dd.service=%(dd.service)s dd.env=%(dd.env)s dd.version=%(dd.version)s"
15-
" dd.trace_id=%(dd.trace_id)s dd.span_id=%(dd.span_id)s]" not in ddtrace_logger.handlers[0].formatter._fmt
16-
)
14+
log_capture_string = StringIO()
15+
handler = logging.StreamHandler(log_capture_string)
16+
handler.setLevel(logging.INFO)
17+
handler.setFormatter(JSONFormatter())
18+
19+
logger = logging.getLogger("ddtrace")
20+
logger.addHandler(handler)
21+
logger.setLevel(logging.INFO)
22+
logger.info("Test log message")
23+
24+
json_contents = json.loads(log_capture_string.getvalue().strip())
25+
assert json_contents.get("dd.service") == "my-service"
26+
assert json_contents.get("dd.env") == "my-env"
27+
assert json_contents.get("dd.version") == "my-version"
1728
print("Test success")

tests/commands/test_runner.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ def test_global_trace_tags(self):
212212

213213
def test_logs_injection(self):
214214
"""Ensure logs injection works"""
215-
with self.override_env(dict(DD_LOGS_INJECTION="true")):
215+
with self.override_env(dict(DD_TAGS="service:my-service,env:my-env,version:my-version")):
216216
out = subprocess.check_output(["ddtrace-run", "python", "tests/commands/ddtrace_run_logs_injection.py"])
217217
assert out.startswith(b"Test success"), out.decode()
218218

tests/integration/test_integration.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -807,8 +807,8 @@ def test_logging_during_tracer_init_succeeds_when_debug_logging_and_logs_injecti
807807
assert out == b"", "an empty program should generate no logs under ddtrace-run"
808808

809809
assert (
810-
b"[dd.service=ddtrace_subprocess_dir dd.env= dd.version= dd.trace_id=0 dd.span_id=0]" in err
811-
), "stderr should contain debug output when DD_TRACE_DEBUG is set"
810+
b"[dd.service=ddtrace_subprocess_dir dd.env= dd.version= dd.trace_id=0 dd.span_id=0]" not in err
811+
), "stderr should not contain debug output when DD_TRACE_DEBUG is set"
812812

813813
assert b"KeyError: 'dd.service'" not in err, "stderr should not contain any exception logs"
814814
assert (

tests/suitespec.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ components:
5555
- ddtrace/internal/gitmetadata.py
5656
- ddtrace/internal/glob_matching.py
5757
- ddtrace/internal/logger.py
58+
- ddtrace/_logger.py
5859
- ddtrace/internal/hostname.py
5960
- ddtrace/internal/http.py
6061
- ddtrace/internal/bytecode_injection/*

0 commit comments

Comments
 (0)