/// <summary>
        /// Adds a <see cref="ConsoleLogProvider"/>, formatted with the <see cref="ILogFormatter"/>
        /// returned by the formatter registration, to the logger.
        /// </summary>
        /// <param name="builder">The <see cref="ILoggerBuilder"/>.</param>
        /// <param name="formatterRegistration">
        /// The method used to create the <see cref="ILogFormatter"/> of the log provider.
        /// </param>
        /// <param name="level">The logging level of the log provider.</param>
        /// <param name="output">The type of console output stream to write to.</param>
        /// <param name="timeout">The timeout of the log provider.</param>
        /// <returns>The same <see cref="ILoggerBuilder"/>.</returns>
        public static ILoggerBuilder AddConsoleLogProvider(this ILoggerBuilder builder,
                                                           Func <IServiceProvider, ILogFormatter> formatterRegistration,
                                                           LogLevel?level = null,
                                                           ConsoleLogProvider.Output?output = null,
                                                           TimeSpan?timeout = null)
        {
            if (formatterRegistration is null)
            {
                throw new ArgumentNullException(nameof(formatterRegistration));
            }

            return(builder.AddConsoleLogProvider(options =>
            {
                options.FormatterRegistration = formatterRegistration;
                if (level != null)
                {
                    options.Level = level.Value;
                }
                if (output != null)
                {
                    options.Output = output.Value;
                }
                if (timeout != null)
                {
                    options.Timeout = timeout;
                }
            }));
        }
        public void AddConsoleLogProviderMethod5SadPath()
        {
            ILoggerBuilder builder = null;

            Action act = () => builder.AddConsoleLogProvider();

            act.Should().ThrowExactly <ArgumentNullException>().WithMessage("*builder*");
        }
 /// <summary>
 /// Adds a <see cref="ConsoleLogProvider"/>, formatted with a <see cref="ILogFormatter"/> of
 /// type <typeparamref name="TLogFormatter"/>, to the logger.
 /// </summary>
 /// <typeparam name="TLogFormatter">
 /// The type of <see cref="ILogFormatter"/> that the log provider uses for formatting logs.
 /// </typeparam>
 /// <param name="builder">The <see cref="ILoggerBuilder"/>.</param>
 /// <param name="level">The logging level of the log provider.</param>
 /// <param name="output">The type of console output stream to write to.</param>
 /// <param name="timeout">The timeout of the log provider.</param>
 /// <param name="logFormatterParameters">
 /// Constructor arguments for type <typeparamref name="TLogFormatter"/> that are not provided
 /// by the <see cref="IServiceProvider"/>.
 /// </param>
 /// <returns>The same <see cref="ILoggerBuilder"/>.</returns>
 public static ILoggerBuilder AddConsoleLogProvider <TLogFormatter>(this ILoggerBuilder builder,
                                                                    LogLevel?level = null,
                                                                    ConsoleLogProvider.Output?output = null,
                                                                    TimeSpan?timeout = null,
                                                                    params object[] logFormatterParameters)
     where TLogFormatter : ILogFormatter
 {
     return(builder.AddConsoleLogProvider(serviceProvider =>
                                          ActivatorUtilities.CreateInstance <TLogFormatter>(serviceProvider, logFormatterParameters),
                                          level, output, timeout));
 }
        /// <summary>
        /// Adds a <see cref="ConsoleLogProvider"/>, formatted with the specified <see cref="ILogFormatter"/>,
        /// to the logger.
        /// </summary>
        /// <param name="builder">The <see cref="ILoggerBuilder"/>.</param>
        /// <param name="formatter">
        /// The <see cref="ILogFormatter"/> that the log provider uses for formatting logs.
        /// </param>
        /// <param name="level">The logging level of the log provider.</param>
        /// <param name="output">The type of console output stream to write to.</param>
        /// <param name="timeout">The timeout of the log provider.</param>
        /// <returns>The same <see cref="ILoggerBuilder"/>.</returns>
        public static ILoggerBuilder AddConsoleLogProvider(this ILoggerBuilder builder,
                                                           ILogFormatter formatter,
                                                           LogLevel?level = null,
                                                           ConsoleLogProvider.Output?output = null,
                                                           TimeSpan?timeout = null)
        {
            if (formatter is null)
            {
                throw new ArgumentNullException(nameof(formatter));
            }

            return(builder.AddConsoleLogProvider(serviceProvider => formatter, level, output, timeout));
        }
        /// <summary>
        /// Adds a <see cref="ConsoleLogProvider"/>, formatted with a <see cref="TemplateLogFormatter"/>,
        /// to the logger.
        /// </summary>
        /// <param name="builder">The <see cref="ILoggerBuilder"/>.</param>
        /// <param name="template">
        /// The template of the <see cref="TemplateLogFormatter"/> that the log provider uses for formatting
        /// logs.
        /// </param>
        /// <param name="level">The logging level of the log provider.</param>
        /// <param name="output">The type of console output stream to write to.</param>
        /// <param name="timeout">The timeout of the log provider.</param>
        /// <returns>The same <see cref="ILoggerBuilder"/>.</returns>
        public static ILoggerBuilder AddConsoleLogProvider(this ILoggerBuilder builder,
                                                           string template,
                                                           LogLevel?level = null,
                                                           ConsoleLogProvider.Output?output = null,
                                                           TimeSpan?timeout = null)
        {
            if (template is null)
            {
                throw new ArgumentNullException(nameof(template));
            }

            return(builder.AddConsoleLogProvider <TemplateLogFormatter>(level, output, timeout, template));
        }