diff --git a/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderExtensions.cs b/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderExtensions.cs index 78364924e03..a07436014fa 100644 --- a/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderExtensions.cs @@ -18,6 +18,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Logging; using OpenTelemetry.Internal; using OpenTelemetry.Resources; @@ -28,6 +29,24 @@ namespace OpenTelemetry.Logs; /// internal static class LoggerProviderBuilderExtensions { + /// + /// Registers a configuration action for the used by + /// integration (). + /// + /// . + /// Configuration action. + /// Returns for chaining. + public static LoggerProviderBuilder ConfigureLoggerOptions( + this LoggerProviderBuilder loggerProviderBuilder, + Action configure) + { + Guard.ThrowIfNull(configure); + + return loggerProviderBuilder.ConfigureServices( + services => services.Configure(configure)); + } + /// /// Sets the from which the Resource associated with /// this provider is built from. Overwrites currently set ResourceBuilder. diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerOptions.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerOptions.cs index f2a392e52e7..208737ffa65 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerOptions.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerOptions.cs @@ -89,6 +89,7 @@ public class OpenTelemetryLoggerOptions /// /// Log processor to add. /// Returns for chaining. + // todo: [Obsolete("Use the LoggerProviderBuilder class to manage processors. The AddProcessor method on OpenTelemetryLoggerOptions will be removed in a future version.")] public OpenTelemetryLoggerOptions AddProcessor(BaseProcessor processor) { Guard.ThrowIfNull(processor); @@ -104,6 +105,7 @@ public OpenTelemetryLoggerOptions AddProcessor(BaseProcessor processo /// /// from which Resource will be built. /// Returns for chaining. + // todo: [Obsolete("Use the LoggerProviderBuilder class to manage resources. The AddProcessor method on OpenTelemetryLoggerOptions will be removed in a future version.")] public OpenTelemetryLoggerOptions SetResourceBuilder(ResourceBuilder resourceBuilder) { Guard.ThrowIfNull(resourceBuilder); diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingExtensions.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingExtensions.cs index 6f63fce672a..72e70f2b696 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingExtensions.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingExtensions.cs @@ -41,45 +41,10 @@ public static class OpenTelemetryLoggingExtensions /// /// The to use. /// The supplied for call chaining. + // todo: [Obsolete("Call AddOpenTelemetryLogging instead the AddOpenTelemetry method will be removed in a future version.")] public static ILoggingBuilder AddOpenTelemetry( this ILoggingBuilder builder) - { - Guard.ThrowIfNull(builder); - - builder.AddConfiguration(); - - // Note: This will bind logger options element (eg "Logging:OpenTelemetry") to OpenTelemetryLoggerOptions - LoggerProviderOptions.RegisterProviderOptions(builder.Services); - - new LoggerProviderServiceCollectionBuilder(builder.Services).ConfigureBuilder( - (sp, logging) => - { - var options = sp.GetRequiredService>().CurrentValue; - - if (options.ResourceBuilder != null) - { - logging.SetResourceBuilder(options.ResourceBuilder); - - options.ResourceBuilder = null; - } - - foreach (var processor in options.Processors) - { - logging.AddProcessor(processor); - } - - options.Processors.Clear(); - }); - - builder.Services.TryAddEnumerable( - ServiceDescriptor.Singleton( - sp => new OpenTelemetryLoggerProvider( - sp.GetRequiredService(), - sp.GetRequiredService>().CurrentValue, - disposeProvider: false))); - - return builder; - } + => AddOpenTelemetryLogging(builder); /// /// Adds an OpenTelemetry logger named 'OpenTelemetry' to the . @@ -88,15 +53,89 @@ public static ILoggingBuilder AddOpenTelemetry( /// The to use. /// Optional configuration action. /// The supplied for call chaining. + // todo: [Obsolete("Call AddOpenTelemetryLogging and use LoggerProviderBuilder.ConfigureLoggerOptions instead. The AddOpenTelemetry method will be removed in a future version.")] public static ILoggingBuilder AddOpenTelemetry( this ILoggingBuilder builder, Action? configure) { + AddOpenTelemetryLogging(builder); + if (configure != null) { builder.Services.Configure(configure); } - return AddOpenTelemetry(builder); + return builder; + } + + /// + /// Adds an OpenTelemetry logger named 'OpenTelemetry' to the . + /// + /// + /// The to use. + /// The supplied for call chaining. + internal static ILoggingBuilder AddOpenTelemetryLogging( + this ILoggingBuilder builder) + => AddOpenTelemetryLogging(builder, b => { }); + + /// + /// Adds an OpenTelemetry logger named 'OpenTelemetry' to the . + /// + /// + /// The to use. + /// Configuration action. + /// The supplied for call chaining. + internal static ILoggingBuilder AddOpenTelemetryLogging( + this ILoggingBuilder builder, + Action configure) + { + Guard.ThrowIfNull(configure); + + AddOpenTelemetryLoggerIntegration(builder); + + var loggerBuilder = new LoggerProviderServiceCollectionBuilder(builder.Services); + + // Note: This code is to support legacy AddProcessor & SetResourceBuilder APIs on OpenTelemetryLoggerOptions. + loggerBuilder.ConfigureBuilder((sp, sdkLoggerBuilder) => + { + var options = sp.GetRequiredService>().CurrentValue; + + if (options.ResourceBuilder != null) + { + sdkLoggerBuilder.SetResourceBuilder(options.ResourceBuilder); + + options.ResourceBuilder = null; + } + + foreach (var processor in options.Processors) + { + sdkLoggerBuilder.AddProcessor(processor); + } + + options.Processors.Clear(); + }); + + configure(loggerBuilder); + + return builder; + } + + private static void AddOpenTelemetryLoggerIntegration(ILoggingBuilder builder) + { + Guard.ThrowIfNull(builder); + + builder.AddConfiguration(); + + // Note: This will bind logger options element (eg "Logging:OpenTelemetry") to OpenTelemetryLoggerOptions + LoggerProviderOptions.RegisterProviderOptions(builder.Services); + + builder.Services.AddOpenTelemetrySharedProviderBuilderServices(); + + builder.Services.TryAddEnumerable( + ServiceDescriptor.Singleton( + sp => new OpenTelemetryLoggerProvider( + sp.GetRequiredService(), + sp.GetRequiredService>().CurrentValue, + disposeProvider: false))); } }