@@ -32,12 +32,20 @@ namespace Microsoft.Extensions.Logging
3232 public static class OpenTelemetryLoggingExtensions
3333 {
3434 /// <summary>
35- /// Adds a OpenTelemetry logger named 'OpenTelemetry' to the factory.
35+ /// Adds an OpenTelemetry logger named 'OpenTelemetry' to the <see cref="ILoggerFactory"/>.
36+ /// </summary>
37+ /// <param name="builder">The <see cref="ILoggingBuilder"/> to use.</param>
38+ /// <returns>The supplied <see cref="ILoggingBuilder"/> for call chaining.</returns>
39+ public static ILoggingBuilder AddOpenTelemetry ( this ILoggingBuilder builder )
40+ => AddOpenTelemetry ( builder , configure : null ) ;
41+
42+ /// <summary>
43+ /// Adds an OpenTelemetry logger named 'OpenTelemetry' to the <see cref="ILoggerFactory"/>.
3644 /// </summary>
3745 /// <param name="builder">The <see cref="ILoggingBuilder"/> to use.</param>
3846 /// <param name="configure">Optional configuration action.</param>
3947 /// <returns>The supplied <see cref="ILoggingBuilder"/> for call chaining.</returns>
40- public static ILoggingBuilder AddOpenTelemetry ( this ILoggingBuilder builder , Action < OpenTelemetryLoggerOptions > ? configure = null )
48+ public static ILoggingBuilder AddOpenTelemetry ( this ILoggingBuilder builder , Action < OpenTelemetryLoggerOptions > ? configure )
4149 {
4250 Guard . ThrowIfNull ( builder ) ;
4351
@@ -51,5 +59,52 @@ public static ILoggingBuilder AddOpenTelemetry(this ILoggingBuilder builder, Act
5159
5260 return builder ;
5361 }
62+
63+ /// <summary>
64+ /// Adds an OpenTelemetry logger named 'OpenTelemetry' to the <see cref="ILoggerFactory"/>.
65+ /// </summary>
66+ /// <remarks>
67+ /// Note: The supplied <see cref="OpenTelemetryLoggerProvider"/> will
68+ /// automatically be disposed when the <see cref="ILoggerFactory"/>
69+ /// built from <paramref name="builder"/> is disposed.
70+ /// </remarks>
71+ /// <param name="builder">The <see cref="ILoggingBuilder"/> to use.</param>
72+ /// <param name="openTelemetryLoggerProvider"><see cref="OpenTelemetryLoggerProvider"/>.</param>
73+ /// <returns>The supplied <see cref="ILoggingBuilder"/> for call chaining.</returns>
74+ public static ILoggingBuilder AddOpenTelemetry ( this ILoggingBuilder builder , OpenTelemetryLoggerProvider openTelemetryLoggerProvider )
75+ => AddOpenTelemetry ( builder , openTelemetryLoggerProvider , disposeProvider : true ) ;
76+
77+ /// <summary>
78+ /// Adds an OpenTelemetry logger named 'OpenTelemetry' to the <see cref="ILoggerFactory"/>.
79+ /// </summary>
80+ /// <param name="builder">The <see cref="ILoggingBuilder"/> to use.</param>
81+ /// <param name="openTelemetryLoggerProvider"><see cref="OpenTelemetryLoggerProvider"/>.</param>
82+ /// <param name="disposeProvider">Controls whether or not the supplied
83+ /// <paramref name="openTelemetryLoggerProvider"/> will be disposed when
84+ /// the <see cref="ILoggerFactory"/> is disposed.</param>
85+ /// <returns>The supplied <see cref="ILoggingBuilder"/> for call chaining.</returns>
86+ public static ILoggingBuilder AddOpenTelemetry (
87+ this ILoggingBuilder builder ,
88+ OpenTelemetryLoggerProvider openTelemetryLoggerProvider ,
89+ bool disposeProvider )
90+ {
91+ Guard . ThrowIfNull ( builder ) ;
92+ Guard . ThrowIfNull ( openTelemetryLoggerProvider ) ;
93+
94+ // Note: Currently if multiple OpenTelemetryLoggerProvider instances
95+ // are added to the same ILoggingBuilder everything after the first
96+ // is silently ignored.
97+
98+ if ( disposeProvider )
99+ {
100+ builder . Services . TryAddEnumerable ( ServiceDescriptor . Singleton < ILoggerProvider , OpenTelemetryLoggerProvider > ( sp => openTelemetryLoggerProvider ) ) ;
101+ }
102+ else
103+ {
104+ builder . Services . TryAddEnumerable ( ServiceDescriptor . Singleton < ILoggerProvider > ( openTelemetryLoggerProvider ) ) ;
105+ }
106+
107+ return builder ;
108+ }
54109 }
55110}
0 commit comments