diff --git a/src/OpenTelemetry.Api/Logs/LoggerProviderBuilder.cs b/src/OpenTelemetry.Api/Logs/LoggerProviderBuilder.cs
index 5e525e73190..c8379f46fb1 100644
--- a/src/OpenTelemetry.Api/Logs/LoggerProviderBuilder.cs
+++ b/src/OpenTelemetry.Api/Logs/LoggerProviderBuilder.cs
@@ -21,7 +21,7 @@ namespace OpenTelemetry.Logs;
///
/// LoggerProviderBuilder base class.
///
-internal abstract class LoggerProviderBuilder
+public abstract class LoggerProviderBuilder
{
///
/// Initializes a new instance of the class.
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..2d5a37c5815 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 OpenTelemetryLoggingBuilder returned by AddOpenTelemetry or call IServiceCollection.ConfigureOpenTelemetryLoggerProvider instead. AddProcessor 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 OpenTelemetryLoggingBuilder returned by AddOpenTelemetry or call IServiceCollection.ConfigureOpenTelemetryLoggerProvider instead. SetResourceBuilder will be removed in a future version.")]
public OpenTelemetryLoggerOptions SetResourceBuilder(ResourceBuilder resourceBuilder)
{
Guard.ThrowIfNull(resourceBuilder);
diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingBuilder.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingBuilder.cs
new file mode 100644
index 00000000000..855e03676d6
--- /dev/null
+++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingBuilder.cs
@@ -0,0 +1,63 @@
+//
+// Copyright The OpenTelemetry Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#nullable enable
+
+using System.Diagnostics;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace OpenTelemetry.Logs;
+
+///
+/// An implementation that exposes methods for configuring OpenTelemetry.
+///
+public sealed class OpenTelemetryLoggingBuilder : LoggerProviderBuilder, ILoggerProviderBuilder, ILoggingBuilder
+{
+ private readonly LoggerProviderServiceCollectionBuilder innerBuiler;
+
+ internal OpenTelemetryLoggingBuilder(IServiceCollection services)
+ {
+ Debug.Assert(services != null, "services was null");
+
+ services.AddOpenTelemetrySharedProviderBuilderServices();
+
+ this.innerBuiler = new LoggerProviderServiceCollectionBuilder(services!);
+ this.Services = services!;
+ }
+
+ ///
+ public IServiceCollection Services { get; }
+
+ ///
+ LoggerProvider? ILoggerProviderBuilder.Provider => null;
+
+ ///
+ public override LoggerProviderBuilder AddInstrumentation(Func instrumentationFactory)
+ => this.innerBuiler.AddInstrumentation(instrumentationFactory);
+
+ ///
+ LoggerProviderBuilder IDeferredLoggerProviderBuilder.Configure(Action configure)
+ {
+ return ((IDeferredLoggerProviderBuilder)this.innerBuiler).Configure(configure);
+ }
+
+ ///
+ LoggerProviderBuilder ILoggerProviderBuilder.ConfigureServices(Action configure)
+ {
+ return this.innerBuiler.ConfigureServices(configure);
+ }
+}
diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingExtensions.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingExtensions.cs
index 6f63fce672a..e7034fbc6ea 100644
--- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingExtensions.cs
+++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingExtensions.cs
@@ -40,8 +40,8 @@ public static class OpenTelemetryLoggingExtensions
/// will be created for a given .
///
/// The to use.
- /// The supplied for call chaining.
- public static ILoggingBuilder AddOpenTelemetry(
+ /// .
+ public static OpenTelemetryLoggingBuilder AddOpenTelemetry(
this ILoggingBuilder builder)
{
Guard.ThrowIfNull(builder);
@@ -51,26 +51,6 @@ public static ILoggingBuilder AddOpenTelemetry(
// 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(
@@ -78,7 +58,29 @@ public static ILoggingBuilder AddOpenTelemetry(
sp.GetRequiredService>().CurrentValue,
disposeProvider: false)));
- return builder;
+ var otelBuilder = new OpenTelemetryLoggingBuilder(builder.Services);
+
+ // Note: This is to support legacy AddProcessor & SetResourceBuilder APIs on OpenTelemetryLoggerOptions
+ otelBuilder.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();
+ });
+
+ return otelBuilder;
}
///
@@ -87,8 +89,8 @@ public static ILoggingBuilder AddOpenTelemetry(
///
/// The to use.
/// Optional configuration action.
- /// The supplied for call chaining.
- public static ILoggingBuilder AddOpenTelemetry(
+ /// .
+ public static OpenTelemetryLoggingBuilder AddOpenTelemetry(
this ILoggingBuilder builder,
Action? configure)
{