public void AddLogProviderMethodSadPath()
        {
            ILoggerBuilder builder = null;

            Action act = () => builder.AddLogProvider <TestLogProvider>();

            act.Should().ThrowExactly <ArgumentNullException>().WithMessage("*builder*");
        }
        /// <summary>
        /// Adds an <see cref="ILogProvider"/> of type <typeparamref name="TLogProvider"/> to the logger.
        /// </summary>
        /// <typeparam name="TLogProvider">The type of <see cref="ILogProvider"/> to add to the logger.</typeparam>
        /// <param name="builder">The <see cref="ILoggerBuilder"/>.</param>
        /// <param name="parameters">
        /// Constructor arguments for type <typeparamref name="TLogProvider"/> that are not provided by the
        /// <see cref="IServiceProvider"/>.
        /// </param>
        /// <returns>The same <see cref="ILoggerBuilder"/></returns>
        public static ILoggerBuilder AddLogProvider <TLogProvider>(this ILoggerBuilder builder, params object[] parameters)
            where TLogProvider : ILogProvider
        {
            if (builder is null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            return(builder.AddLogProvider(serviceProvider => ActivatorUtilities.CreateInstance <TLogProvider>(serviceProvider, parameters)));
        }
        /// <summary>
        /// Adds a <see cref="DebugLogProvider"/> to the logger.
        /// </summary>
        /// <param name="builder">The <see cref="ILoggerBuilder"/>.</param>
        /// <param name="configureOptions">
        /// A delegate to configure the <see cref="DebugLogProviderOptions"/> object that is used to
        /// configure the log provider.
        /// </param>
        /// <returns>The same <see cref="ILoggerBuilder"/>.</returns>
        public static ILoggerBuilder AddDebugLogProvider(this ILoggerBuilder builder,
                                                         Action <DebugLogProviderOptions> configureOptions = null)
        {
            if (builder is null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            return(builder.AddLogProvider(serviceProvider =>
            {
                var optionsLoggerName = builder.LoggerName == Logger.DefaultName
                    ? Options.DefaultName
                    : builder.LoggerName;

                var optionsMonitor = serviceProvider.GetService <IOptionsMonitor <DebugLogProviderOptions> >();
                var options = optionsMonitor?.Get(optionsLoggerName) ?? new DebugLogProviderOptions();
                configureOptions?.Invoke(options);

                var formatter = options.FormatterRegistration?.Invoke(serviceProvider)
                                ?? new TemplateLogFormatter(DebugLogProvider.DefaultTemplate);

                return new DebugLogProvider(formatter, options.Level, options.Timeout);
            }));
        }