|
39 | 39 | from opentelemetry.metrics import set_meter_provider |
40 | 40 | from opentelemetry.sdk._logs import ( |
41 | 41 | LoggerProvider, |
| 42 | + LoggingHandler, |
42 | 43 | LogRecordProcessor, |
43 | 44 | ) |
44 | 45 | from opentelemetry.sdk._logs.export import ( |
45 | 46 | BatchLogRecordProcessor, |
46 | 47 | LogRecordExporter, |
47 | 48 | ) |
48 | 49 | from opentelemetry.sdk.environment_variables import ( |
| 50 | + _OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED, |
49 | 51 | OTEL_EXPORTER_OTLP_LOGS_PROTOCOL, |
50 | 52 | OTEL_EXPORTER_OTLP_METRICS_PROTOCOL, |
51 | 53 | OTEL_EXPORTER_OTLP_PROTOCOL, |
@@ -324,9 +326,41 @@ def _init_logging( |
324 | 326 | set_event_logger_provider(event_logger_provider) |
325 | 327 |
|
326 | 328 | if setup_logging_handler: |
327 | | - _logger.warning( |
328 | | - "Handling of logging integrations has been moved to opentelemetry-instrumentation" |
| 329 | + warnings.deprecated( |
| 330 | + "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" |
| 331 | + ) |
| 332 | + |
| 333 | + # Add OTel handler |
| 334 | + handler = LoggingHandler( |
| 335 | + level=logging.NOTSET, logger_provider=provider |
329 | 336 | ) |
| 337 | + logging.getLogger().addHandler(handler) |
| 338 | + _overwrite_logging_config_fns(handler) |
| 339 | + |
| 340 | + |
| 341 | +def _overwrite_logging_config_fns(handler: LoggingHandler) -> None: |
| 342 | + root = logging.getLogger() |
| 343 | + |
| 344 | + def wrapper(config_fn: Callable) -> Callable: |
| 345 | + def overwritten_config_fn(*args, **kwargs): |
| 346 | + removed_handler = False |
| 347 | + # We don't want the OTLP handler to be modified or deleted by the logging config functions. |
| 348 | + # So we remove it and then add it back after the function call. |
| 349 | + if handler in root.handlers: |
| 350 | + removed_handler = True |
| 351 | + root.handlers.remove(handler) |
| 352 | + try: |
| 353 | + config_fn(*args, **kwargs) |
| 354 | + finally: |
| 355 | + # Ensure handler is added back if logging function throws exception. |
| 356 | + if removed_handler: |
| 357 | + root.addHandler(handler) |
| 358 | + |
| 359 | + return overwritten_config_fn |
| 360 | + |
| 361 | + logging.config.fileConfig = wrapper(logging.config.fileConfig) |
| 362 | + logging.config.dictConfig = wrapper(logging.config.dictConfig) |
| 363 | + logging.basicConfig = wrapper(logging.basicConfig) |
330 | 364 |
|
331 | 365 |
|
332 | 366 | def _import_tracer_configurator( |
@@ -519,6 +553,15 @@ def _initialize_components( |
519 | 553 | _init_metrics( |
520 | 554 | metric_exporters, resource, exporter_args_map=exporter_args_map |
521 | 555 | ) |
| 556 | + if setup_logging_handler is None: |
| 557 | + setup_logging_handler = ( |
| 558 | + os.getenv( |
| 559 | + _OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED, "false" |
| 560 | + ) |
| 561 | + .strip() |
| 562 | + .lower() |
| 563 | + == "true" |
| 564 | + ) |
522 | 565 | _init_logging( |
523 | 566 | log_exporters, |
524 | 567 | resource, |
|
0 commit comments