From bbfbd629dba218b0c55ff17f8a400508a1a6c292 Mon Sep 17 00:00:00 2001 From: Riccardo Magliocchetti Date: Tue, 17 Feb 2026 12:56:31 +0100 Subject: [PATCH 1/4] opentelemetry-sdk: depcreate logging handler Move config handling to opentelemetry-instrumentation and the handler to opentelemetry-instrumentation-logging --- .../sdk/_configuration/__init__.py | 33 ++----------------- .../sdk/_logs/_internal/__init__.py | 4 +++ 2 files changed, 6 insertions(+), 31 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py index d1af469bc9..28da9c8fbc 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py @@ -39,7 +39,6 @@ from opentelemetry.metrics import set_meter_provider from opentelemetry.sdk._logs import ( LoggerProvider, - LoggingHandler, LogRecordProcessor, ) from opentelemetry.sdk._logs.export import ( @@ -326,37 +325,9 @@ def _init_logging( set_event_logger_provider(event_logger_provider) if setup_logging_handler: - # Add OTel handler - handler = LoggingHandler( - level=logging.NOTSET, logger_provider=provider + _logger.warning( + "Handling of logging integrations as been moved to opentelemetry-instrumentation" ) - logging.getLogger().addHandler(handler) - _overwrite_logging_config_fns(handler) - - -def _overwrite_logging_config_fns(handler: LoggingHandler) -> None: - root = logging.getLogger() - - def wrapper(config_fn: Callable) -> Callable: - def overwritten_config_fn(*args, **kwargs): - removed_handler = False - # We don't want the OTLP handler to be modified or deleted by the logging config functions. - # So we remove it and then add it back after the function call. - if handler in root.handlers: - removed_handler = True - root.handlers.remove(handler) - try: - config_fn(*args, **kwargs) - finally: - # Ensure handler is added back if logging function throws exception. - if removed_handler: - root.addHandler(handler) - - return overwritten_config_fn - - logging.config.fileConfig = wrapper(logging.config.fileConfig) - logging.config.dictConfig = wrapper(logging.config.dictConfig) - logging.basicConfig = wrapper(logging.basicConfig) def _import_tracer_configurator( diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py index d775dd4455..b2e7a58b0a 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py @@ -496,6 +496,10 @@ def __init__( super().__init__(level=level) self._logger_provider = logger_provider or get_logger_provider() + warnings.deprecated( + "This is deprecated you should use the one in opentelemetry-instrumentation-logging" + ) + @staticmethod def _get_attributes(record: logging.LogRecord) -> _ExtendedAttributes: attributes = { From 60062941f7732126019ff5e29b224c149ca1b1a7 Mon Sep 17 00:00:00 2001 From: Riccardo Magliocchetti Date: Tue, 17 Feb 2026 14:47:01 +0100 Subject: [PATCH 2/4] Drop handling of env var --- .../src/opentelemetry/sdk/_configuration/__init__.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py index 28da9c8fbc..86185b65e7 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py @@ -46,7 +46,6 @@ LogRecordExporter, ) from opentelemetry.sdk.environment_variables import ( - _OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED, OTEL_EXPORTER_OTLP_LOGS_PROTOCOL, OTEL_EXPORTER_OTLP_METRICS_PROTOCOL, OTEL_EXPORTER_OTLP_PROTOCOL, @@ -520,15 +519,6 @@ def _initialize_components( _init_metrics( metric_exporters, resource, exporter_args_map=exporter_args_map ) - if setup_logging_handler is None: - setup_logging_handler = ( - os.getenv( - _OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED, "false" - ) - .strip() - .lower() - == "true" - ) _init_logging( log_exporters, resource, From d10228e7f6ac5edfc1a073d8e5409ab6da60ed70 Mon Sep 17 00:00:00 2001 From: Riccardo Magliocchetti Date: Tue, 17 Feb 2026 15:19:22 +0100 Subject: [PATCH 3/4] Fix typo --- .../src/opentelemetry/sdk/_configuration/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py index 86185b65e7..8d827364dc 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py @@ -325,7 +325,7 @@ def _init_logging( if setup_logging_handler: _logger.warning( - "Handling of logging integrations as been moved to opentelemetry-instrumentation" + "Handling of logging integrations has been moved to opentelemetry-instrumentation" ) From a2fed31bb42f197a8d4c42e4cb13ca9b93f6d0ed Mon Sep 17 00:00:00 2001 From: Riccardo Magliocchetti Date: Thu, 19 Feb 2026 17:15:59 +0100 Subject: [PATCH 4/4] Reinstate the old code --- .../sdk/_configuration/__init__.py | 47 ++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py index 8d827364dc..5d5a993009 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py @@ -39,6 +39,7 @@ from opentelemetry.metrics import set_meter_provider from opentelemetry.sdk._logs import ( LoggerProvider, + LoggingHandler, LogRecordProcessor, ) from opentelemetry.sdk._logs.export import ( @@ -46,6 +47,7 @@ LogRecordExporter, ) from opentelemetry.sdk.environment_variables import ( + _OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED, OTEL_EXPORTER_OTLP_LOGS_PROTOCOL, OTEL_EXPORTER_OTLP_METRICS_PROTOCOL, OTEL_EXPORTER_OTLP_PROTOCOL, @@ -324,9 +326,41 @@ def _init_logging( set_event_logger_provider(event_logger_provider) if setup_logging_handler: - _logger.warning( - "Handling of logging integrations has been moved to opentelemetry-instrumentation" + warnings.deprecated( + "Setting the OTel Logging handler from the SDK and the `OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED` are deprecated. You should install the opentelemetry-instrumentation-logging" + ) + + # Add OTel handler + handler = LoggingHandler( + level=logging.NOTSET, logger_provider=provider ) + logging.getLogger().addHandler(handler) + _overwrite_logging_config_fns(handler) + + +def _overwrite_logging_config_fns(handler: LoggingHandler) -> None: + root = logging.getLogger() + + def wrapper(config_fn: Callable) -> Callable: + def overwritten_config_fn(*args, **kwargs): + removed_handler = False + # We don't want the OTLP handler to be modified or deleted by the logging config functions. + # So we remove it and then add it back after the function call. + if handler in root.handlers: + removed_handler = True + root.handlers.remove(handler) + try: + config_fn(*args, **kwargs) + finally: + # Ensure handler is added back if logging function throws exception. + if removed_handler: + root.addHandler(handler) + + return overwritten_config_fn + + logging.config.fileConfig = wrapper(logging.config.fileConfig) + logging.config.dictConfig = wrapper(logging.config.dictConfig) + logging.basicConfig = wrapper(logging.basicConfig) def _import_tracer_configurator( @@ -519,6 +553,15 @@ def _initialize_components( _init_metrics( metric_exporters, resource, exporter_args_map=exporter_args_map ) + if setup_logging_handler is None: + setup_logging_handler = ( + os.getenv( + _OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED, "false" + ) + .strip() + .lower() + == "true" + ) _init_logging( log_exporters, resource,