2121import threading
2222import traceback
2323import warnings
24+ from functools import wraps
2425from os import environ
2526from threading import Lock
2627from time import time_ns
27- from typing import Any , Callable , Tuple , Union , cast # noqa
28+ from typing import Any , Callable , Tuple , Union , cast , overload # noqa
2829
2930from opentelemetry ._logs import Logger as APILogger
3031from opentelemetry ._logs import LoggerProvider as APILoggerProvider
@@ -166,6 +167,19 @@ def _from_env_if_absent(
166167)
167168
168169
170+ def deprecated (message ):
171+ # Custom "deprecated" decorator compatible with Python < 3.13
172+ def decorator (func ):
173+ @wraps (func )
174+ def wrapper (* args , ** kwargs ):
175+ warnings .warn (message , DeprecationWarning , stacklevel = 2 )
176+ return func (* args , ** kwargs )
177+
178+ return wrapper
179+
180+ return decorator
181+
182+
169183class LogRecord (APILogRecord ):
170184 """A LogRecord instance represents an event being logged.
171185
@@ -174,6 +188,39 @@ class LogRecord(APILogRecord):
174188 pertinent to the event being logged.
175189 """
176190
191+ @overload
192+ def __init__ (
193+ self ,
194+ timestamp : int | None = None ,
195+ observed_timestamp : int | None = None ,
196+ context : Context | None = None ,
197+ severity_text : str | None = None ,
198+ severity_number : SeverityNumber | None = None ,
199+ body : AnyValue | None = None ,
200+ resource : Resource | None = None ,
201+ attributes : _ExtendedAttributes | None = None ,
202+ limits : LogLimits | None = _UnsetLogLimits ,
203+ ): ...
204+
205+ @overload
206+ @deprecated (
207+ "LogRecord init with `trace_id`, `span_id`, and/or `trace_flags` is deprecated. Use `context` instead."
208+ )
209+ def __init__ (
210+ self ,
211+ timestamp : int | None = None ,
212+ observed_timestamp : int | None = None ,
213+ trace_id : int | None = None ,
214+ span_id : int | None = None ,
215+ trace_flags : TraceFlags | None = None ,
216+ severity_text : str | None = None ,
217+ severity_number : SeverityNumber | None = None ,
218+ body : AnyValue | None = None ,
219+ resource : Resource | None = None ,
220+ attributes : _ExtendedAttributes | None = None ,
221+ limits : LogLimits | None = _UnsetLogLimits ,
222+ ): ...
223+
177224 def __init__ (
178225 self ,
179226 timestamp : int | None = None ,
@@ -189,9 +236,9 @@ def __init__(
189236 attributes : _ExtendedAttributes | None = None ,
190237 limits : LogLimits | None = _UnsetLogLimits ,
191238 ):
192- # Prioritizes context over trace_id / span_id / trace_flags.
193- # If context provided and its current span valid, then uses that span info.
194- # Otherwise, uses provided trace_id etc for backwards compatibility.
239+ if not context :
240+ context = get_current ()
241+
195242 if context is not None :
196243 span = get_current_span (context )
197244 span_context = span .get_span_context ()
@@ -563,7 +610,6 @@ def _translate(self, record: logging.LogRecord) -> LogRecord:
563610 return LogRecord (
564611 timestamp = timestamp ,
565612 observed_timestamp = observered_timestamp ,
566- context = get_current (),
567613 trace_id = span_context .trace_id ,
568614 span_id = span_context .span_id ,
569615 trace_flags = span_context .trace_flags ,
0 commit comments