|
42 | 42 | LoggingHandler, |
43 | 43 | LogRecordProcessor, |
44 | 44 | ) |
| 45 | +from opentelemetry.sdk._logs._internal import LoggerConfiguratorT |
45 | 46 | from opentelemetry.sdk._logs.export import ( |
46 | 47 | BatchLogRecordProcessor, |
47 | 48 | LogRecordExporter, |
|
52 | 53 | OTEL_EXPORTER_OTLP_METRICS_PROTOCOL, |
53 | 54 | OTEL_EXPORTER_OTLP_PROTOCOL, |
54 | 55 | OTEL_EXPORTER_OTLP_TRACES_PROTOCOL, |
| 56 | + OTEL_PYTHON_LOGGER_CONFIGURATOR, |
55 | 57 | OTEL_PYTHON_TRACER_CONFIGURATOR, |
56 | 58 | OTEL_TRACES_SAMPLER, |
57 | 59 | OTEL_TRACES_SAMPLER_ARG, |
@@ -171,6 +173,10 @@ def _get_tracer_configurator() -> str | None: |
171 | 173 | return environ.get(OTEL_PYTHON_TRACER_CONFIGURATOR, None) |
172 | 174 |
|
173 | 175 |
|
| 176 | +def _get_logger_configurator() -> str | None: |
| 177 | + return environ.get(OTEL_PYTHON_LOGGER_CONFIGURATOR, None) |
| 178 | + |
| 179 | + |
174 | 180 | def _get_exporter_entry_point( |
175 | 181 | exporter_name: str, signal_type: Literal["traces", "metrics", "logs"] |
176 | 182 | ): |
@@ -294,8 +300,11 @@ def _init_logging( |
294 | 300 | log_record_processors: Sequence[LogRecordProcessor] | None = None, |
295 | 301 | export_log_record_processor: _ConfigurationExporterLogRecordProcessorT |
296 | 302 | | None = None, |
| 303 | + logger_configurator: LoggerConfiguratorT | None = None, |
297 | 304 | ): |
298 | | - provider = LoggerProvider(resource=resource) |
| 305 | + provider = LoggerProvider( |
| 306 | + resource=resource, logger_configurator=logger_configurator |
| 307 | + ) |
299 | 308 | set_logger_provider(provider) |
300 | 309 |
|
301 | 310 | exporter_args_map = exporter_args_map or {} |
@@ -366,6 +375,27 @@ def overwritten_config_fn(*args, **kwargs): |
366 | 375 | logging.basicConfig = wrapper(logging.basicConfig) |
367 | 376 |
|
368 | 377 |
|
| 378 | +def _import_logger_configurator( |
| 379 | + logger_configurator_name: str | None, |
| 380 | +) -> LoggerConfiguratorT | None: |
| 381 | + if not logger_configurator_name: |
| 382 | + return None |
| 383 | + |
| 384 | + try: |
| 385 | + _, logger_configurator_impl = _import_config_components( |
| 386 | + [logger_configurator_name.strip()], |
| 387 | + "_opentelemetry_logger_configurator", |
| 388 | + )[0] |
| 389 | + except Exception as exc: # pylint: disable=broad-exception-caught |
| 390 | + _logger.warning( |
| 391 | + "Using default logger configurator. Failed to load logger configurator, %s: %s", |
| 392 | + logger_configurator_name, |
| 393 | + exc, |
| 394 | + ) |
| 395 | + return None |
| 396 | + return logger_configurator_impl |
| 397 | + |
| 398 | + |
369 | 399 | def _import_tracer_configurator( |
370 | 400 | tracer_configurator_name: str | None, |
371 | 401 | ) -> _TracerConfiguratorT | None: |
@@ -507,6 +537,7 @@ def _initialize_components( |
507 | 537 | export_log_record_processor: _ConfigurationExporterLogRecordProcessorT |
508 | 538 | | None = None, |
509 | 539 | tracer_configurator: _TracerConfiguratorT | None = None, |
| 540 | + logger_configurator: LoggerConfiguratorT | None = None, |
510 | 541 | ): |
511 | 542 | # pylint: disable=too-many-locals |
512 | 543 | if trace_exporter_names is None: |
@@ -538,6 +569,11 @@ def _initialize_components( |
538 | 569 | tracer_configurator = _import_tracer_configurator( |
539 | 570 | tracer_configurator_name |
540 | 571 | ) |
| 572 | + if logger_configurator is None: |
| 573 | + logger_configurator_name = _get_logger_configurator() |
| 574 | + logger_configurator = _import_logger_configurator( |
| 575 | + logger_configurator_name |
| 576 | + ) |
541 | 577 |
|
542 | 578 | # if env var OTEL_RESOURCE_ATTRIBUTES is given, it will read the service_name |
543 | 579 | # from the env variable else defaults to "unknown_service" |
@@ -572,6 +608,7 @@ def _initialize_components( |
572 | 608 | exporter_args_map=exporter_args_map, |
573 | 609 | log_record_processors=log_record_processors, |
574 | 610 | export_log_record_processor=export_log_record_processor, |
| 611 | + logger_configurator=logger_configurator, |
575 | 612 | ) |
576 | 613 |
|
577 | 614 |
|
|
0 commit comments