Example #1
0
        private static Microsoft.Extensions.Logging.ILogger GetLogger()
        {
            var providers = new LoggerProviderCollection();

            Log.Logger = new LoggerConfiguration()
                         .MinimumLevel.Debug()
                         .WriteTo.Console()
                         .WriteTo.Providers(providers)
                         .CreateLogger();

            var services = new ServiceCollection();

            services.AddSingleton(providers);
            services.AddSingleton <ILoggerFactory>(sc =>
            {
                var providerCollection = sc.GetService <LoggerProviderCollection>();
                var factory            = new SerilogLoggerFactory(null, true, providerCollection);

                foreach (var provider in sc.GetServices <ILoggerProvider>())
                {
                    factory.AddProvider(provider);
                }

                return(factory);
            });

            services.AddLogging(l => l.AddConsole());

            var serviceProvider = services.BuildServiceProvider();
            var logger          = serviceProvider.GetRequiredService <Microsoft.Extensions.Logging.ILogger <Program> >();

            return(logger);
        }
        //This method makes a service provider which contains all the dependencies of the runner
        public IServiceProvider Build()
        {
            var providers = new LoggerProviderCollection();

            Log.Logger = new LoggerConfiguration()
                         .MinimumLevel.Debug()
                         .WriteTo.MongoDB(Environment.GetEnvironmentVariable("MP_CONNECTIONSTRING") + "/" + Environment.GetEnvironmentVariable("MP_DATABASE"),
                                          collectionName: Environment.GetEnvironmentVariable("MP_LOGCOLLECTION"))
                         .WriteTo.Providers(providers)
                         .CreateLogger();

            var container = new ServiceCollection();

            container.AddSingleton <IApp, App>();
            container.AddSingleton <IMessageBroker, RabbitBroker>();
            container.AddSingleton <IMessageBrokerConfig, RabbitMQConfig>();
            container.AddSingleton <IDockerService, DockerService>();
            container.AddSingleton(providers);
            container.AddSingleton <ILoggerFactory>(sc => {
                var providerCollection = sc.GetService <LoggerProviderCollection>();
                var factory            = new SerilogLoggerFactory(null, true, providerCollection);

                foreach (var provider in sc.GetServices <ILoggerProvider>())
                {
                    factory.AddProvider(provider);
                }

                return(factory);
            });
            container.AddLogging();
            return(container.BuildServiceProvider());
        }
        public static IHostBuilder UseSerilog(
            this IHostBuilder builder,
            Action <HostBuilderContext, LoggerConfiguration> configureLogger,
            bool preserveStaticLogger = false,
            bool writeToProviders     = false)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            if (configureLogger == null)
            {
                throw new ArgumentNullException(nameof(configureLogger));
            }

            builder.ConfigureServices((context, collection) =>
            {
                var loggerConfiguration = new LoggerConfiguration();

                LoggerProviderCollection loggerProviders = null;
                if (writeToProviders)
                {
                    loggerProviders = new LoggerProviderCollection();
                    loggerConfiguration.WriteTo.Providers(loggerProviders);
                }

                configureLogger(context, loggerConfiguration);
                var logger = loggerConfiguration.CreateLogger();

                Serilog.ILogger registeredLogger = null;
                if (preserveStaticLogger)
                {
                    registeredLogger = logger;
                }
                else
                {
                    // Passing a `null` logger to `SerilogLoggerFactory` results in disposal via
                    // `Log.CloseAndFlush()`, which additionally replaces the static logger with a no-op.
                    Log.Logger = logger;
                }

                collection.AddSingleton <ILoggerFactory>(services =>
                {
                    var factory = new SerilogLoggerFactory(registeredLogger, true, loggerProviders);

                    if (writeToProviders)
                    {
                        foreach (var provider in services.GetServices <ILoggerProvider>())
                        {
                            factory.AddProvider(provider);
                        }
                    }

                    return(factory);
                });

                ConfigureServices(collection, logger);
            });
            return(builder);
        }
Example #4
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            var providers = new LoggerProviderCollection();

            Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(Configuration).CreateLogger();

            ConfigureCors(services);
            ConfigureSwagger(services);

            services.AddSingleton(providers);
            services.AddSingleton <ILoggerFactory>(sc =>
            {
                var providerCollection = sc.GetService <LoggerProviderCollection>();
                var factory            = new SerilogLoggerFactory(null, true, providerCollection);

                foreach (var provider in sc.GetServices <ILoggerProvider>())
                {
                    factory.AddProvider(provider);
                }

                return(factory);
            });

            services.AddControllers();

            ConfigureDatabase(services);
            ConfigureCustomServices(services);
        }
        public static IServiceCollection AddDefaultSerilog(this IServiceCollection serviceDescriptors, WebApiConfig apiConfig = null, Action <LoggerConfiguration> configureLogger = null, bool preserveStaticLogger = false, bool writeToProviders = true)
        {
            var loggerConfiguration = new LoggerConfiguration();

            LoggerProviderCollection loggerProviders = null;

            if (writeToProviders)
            {
                loggerProviders = new LoggerProviderCollection();

                loggerConfiguration.WriteTo.Providers(loggerProviders);
            }

            apiConfig = apiConfig ?? new WebApiConfig();
            configFromWebApiConfig(loggerConfiguration, apiConfig);

            configureLogger?.Invoke(loggerConfiguration);
            var logger = loggerConfiguration.CreateLogger();


            Serilog.ILogger registeredLogger = null;
            if (preserveStaticLogger)
            {
                registeredLogger = logger;
            }
            else
            {
                Log.Logger = logger;
            }

            // 去除内置的LoggerProvider
            var removeProviders = serviceDescriptors.Where(x => x.ServiceType == typeof(ILoggerProvider)).ToList();

            removeProviders.ForEach(p =>
            {
                serviceDescriptors.Remove(p);
            });


            serviceDescriptors.AddSingleton <ILoggerFactory>(services =>
            {
                var factory = new SerilogLoggerFactory(registeredLogger, true, loggerProviders);

                if (writeToProviders)
                {
                    foreach (var provider in services.GetServices <ILoggerProvider>())
                    {
                        factory.AddProvider(provider);
                    }
                }

                return(factory);
            });

            // 日志定时清理托管服务
            serviceDescriptors.AddHostedService <ClearLogsHostService>();

            return(serviceDescriptors);
        }
 public HomeController(
     ILogger <HomeController> logger,
     IDiagnosticContext diagnosticContext,
     LoggerProviderCollection loggerProviderCollection)
 {
     Logger                   = logger ?? throw new ArgumentNullException(nameof(logger));
     DiagnosticContext        = diagnosticContext ?? throw new ArgumentNullException(nameof(diagnosticContext));
     LoggerProviderCollection = loggerProviderCollection ?? throw new ArgumentNullException(nameof(loggerProviderCollection));
 }
        public ViewResult Index([FromQuery] string name = "SinjulMSBH")
        {
            Logger.LogInformation("Hello, {Name} .. !!!!", name);

            DiagnosticContext.Set("IndexCallCount", Interlocked.Increment(ref _callCount));

            IEnumerable <ILoggerProvider> providers = new LoggerProviderCollection().Providers;

            return(View());
        }
        public ViewResult Index([FromQuery] string name = "SinjulMSBH")
        {
            Logger.LogInformation("Hello, {Name} .. !!!!", name);

            DiagnosticContext.Set("IndexCallCount", Interlocked.Increment(ref _callCount));

            IEnumerable <ILoggerProvider> providers = new LoggerProviderCollection().Providers;

            Log.ForContext <ShoppingCartService>().Information("Adding {ItemId} x {Quantity} to cart", itemId, quantity);

            return(View());
        }
Example #9
0
 /// <summary>
 /// Write Serilog events to the providers in <paramref name="providers"/>.
 /// </summary>
 /// <param name="configuration">The `WriteTo` object.</param>
 /// <param name="providers">A <see cref="LoggerProviderCollection"/> to write events to.</param>
 /// <param name="restrictedToMinimumLevel">The minimum level for
 /// events passed through the sink. Ignored when <paramref name="levelSwitch"/> is specified.</param>
 /// <param name="levelSwitch">A switch allowing the pass-through minimum level
 /// to be changed at runtime.</param>
 /// <returns>A <see cref="LoggerConfiguration"/> to allow method chaining.</returns>
 public static LoggerConfiguration Providers(
     this LoggerSinkConfiguration configuration,
     LoggerProviderCollection providers,
     LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum,
     LoggingLevelSwitch levelSwitch         = null)
 {
     if (configuration == null)
     {
         throw new ArgumentNullException(nameof(configuration));
     }
     if (providers == null)
     {
         throw new ArgumentNullException(nameof(providers));
     }
     return(configuration.Sink(new LoggerProviderCollectionSink(providers), restrictedToMinimumLevel, levelSwitch));
 }
Example #10
0
        public static void Main(string[] args)
        {
            var providers  = new LoggerProviderCollection();
            var seriConfig = new LoggerConfiguration()
                             .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
                             .MinimumLevel.Override("System", LogEventLevel.Error)
                             .MinimumLevel.Override("Serilog.Ext.Logging.Bug._174.Controllers.WeatherForecastController", LogEventLevel.Verbose)
                             .Enrich.FromLogContext()
            ;

            seriConfig.WriteTo.Console(
                restrictedToMinimumLevel: LevelConvert.ToSerilogLevel(LogLevel.Information),
                standardErrorFromLevel: LogEventLevel.Error);
            Log.Logger = seriConfig.CreateLogger();
            System.Diagnostics.Activity.DefaultIdFormat = System.Diagnostics.ActivityIdFormat.W3C;
            CreateHostBuilder(args).Build().Run();
        }
Example #11
0
        private static void Main(string[] args)
        {
            var providers   = new LoggerProviderCollection();
            var logTemplate = "[{Level:u}] {Message}{NewLine}{Exception}";

            Log.Logger = new LoggerConfiguration()
                         .WriteTo.File("Hades_General.txt")
                         .WriteTo.File("Hades_Exceptions.txt", Serilog.Events.LogEventLevel.Error)
                         .WriteTo.File("Hades_CrashLogs.txt", Serilog.Events.LogEventLevel.Fatal)
                         .WriteTo.Console(Serilog.Events.LogEventLevel.Verbose, outputTemplate: logTemplate)
                         .CreateLogger();


            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            var builder = new ConfigurationBuilder()
                          .SetBasePath(Directory.GetCurrentDirectory())
                          .AddJsonFile("LoruleConfig.json");

            var config          = builder.Build();
            var constants       = config.GetSection("ServerConfig").Get <ServerConstants>();
            var serviceProvider = new ServiceCollection()
                                  .AddOptions()
                                  .AddSingleton(providers)
                                  .AddSingleton <ILoggerFactory>(sc =>
            {
                var providerCollection = sc.GetService <LoggerProviderCollection>();
                var factory            = new SerilogLoggerFactory(null, true, providerCollection);

                foreach (var provider in sc.GetServices <ILoggerProvider>())
                {
                    factory.AddProvider(provider);
                }

                return(factory);
            })
                                  .AddLogging(l => l.AddConsole())
                                  .Configure <LoruleOptions>(config.GetSection("Content"))
                                  .AddSingleton <IServerConstants, ServerConstants>(_ => constants)
                                  .AddSingleton <IServerContext, ServerContext>()
                                  .AddSingleton <IObjectManager, ObjectManager>()
                                  .AddSingleton <IServer, Server>()
                                  .BuildServiceProvider();

            serviceProvider.GetService <IServer>();
            Thread.CurrentThread.Join();
        }
Example #12
0
        public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
        .ConfigureLogging(log =>
        {
            var providers    = new LoggerProviderCollection();
            var loggerConfig = new LoggerConfiguration()
                               .WriteTo.Providers(providers)
                               .WriteTo.Console()
                               .WriteTo.File(new JsonFormatter(), "log/log.json")
                               .CreateLogger();

            log.ClearProviders();         // agar provider default tidak di ikut sertakan
            log.AddSerilog(loggerConfig);
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup <Startup>();
        });
Example #13
0
        private static void Main()
        {
            var providers = new LoggerProviderCollection();

            Log.Logger = new LoggerConfiguration()
                         .WriteTo.File(new CompactJsonFormatter(), "lorule_logs.txt")
                         .WriteTo.Console()
                         .CreateLogger();

            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            var builder = new ConfigurationBuilder()
                          .SetBasePath(Directory.GetCurrentDirectory())
                          .AddJsonFile("ServerConfig.Local.json");

            var config    = builder.Build();
            var constants = config.GetSection("ServerConfig").Get <ServerConstants>();

            var serviceProvider = new ServiceCollection()
                                  .AddOptions()
                                  .AddSingleton(providers)
                                  .AddSingleton <ILoggerFactory>(sc =>
            {
                var providerCollection = sc.GetService <LoggerProviderCollection>();
                var factory            = new SerilogLoggerFactory(null, true, providerCollection);

                foreach (var provider in sc.GetServices <ILoggerProvider>())
                {
                    factory.AddProvider(provider);
                }

                return(factory);
            })
                                  .AddLogging(l => l.AddConsole())
                                  .Configure <LoruleOptions>(config.GetSection("Content"))
                                  .AddSingleton <IServerConstants, ServerConstants>(_ => constants)
                                  .AddSingleton <IServerContext, ServerContext>()
                                  .AddSingleton <IObjectManager, ObjectManager>()
                                  .AddSingleton <IServer, Server>()
                                  .BuildServiceProvider();

            serviceProvider.GetService <IServer>();
            Thread.CurrentThread.Join();
        }
Example #14
0
        public static IServiceCollection ConfigureLogger(this IServiceCollection services, IConfiguration configuration)
        {
            var providers = new LoggerProviderCollection();

            Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger();

            services.AddSingleton(providers);
            services.AddSingleton <ILoggerFactory>(sc =>
            {
                var providerCollection = sc.GetService <LoggerProviderCollection>();
                var factory            = new SerilogLoggerFactory(null, true, providerCollection);

                foreach (var provider in sc.GetServices <ILoggerProvider>())
                {
                    factory.AddProvider(provider);
                }

                return(factory);
            });

            return(services);
        }
Example #15
0
        /// <summary>
        /// Helper de configuração de logs da applicação
        /// </summary>
        /// <param name="services"><see cref="IServiceCollection"/> contendo os serviços da aplicação</param>
        private static void ConfigureLogger(this IServiceCollection services)
        {
            var providers = new LoggerProviderCollection();

            Log.Logger = new LoggerConfiguration()
                         .MinimumLevel.Debug()
                         .WriteTo.Console()
                         .WriteTo.Providers(providers)
                         .CreateLogger();

            services.AddSingleton <ILoggerFactory>(sc =>
            {
                var providerCollection = sc.GetService <LoggerProviderCollection>();
                var factory            = new SerilogLoggerFactory(null, true, providerCollection);

                foreach (var provider in sc.GetServices <ILoggerProvider>())
                {
                    factory.AddProvider(provider);
                }

                return(factory);
            });
        }
Example #16
0
        private static (IHostBuilder, Initialization) CreateHostBuilder(string[] args)
        {
            Initialization initializer = new Initialization();
            IHostBuilder   builder     = Host.CreateDefaultBuilder(args);

            builder.ConfigureServices((env, services) =>
            {
                Initialization.Configure(services);
                services.AddSingleton <LoggerProviderCollection>();
                Log.Logger = Initialization.Logging(env.HostingEnvironment.ContentRootPath);
                services.AddSingleton <ILoggerFactory>(sp =>
                {
                    LoggerProviderCollection loggerProviderCollection = sp.GetRequiredService <LoggerProviderCollection>();
                    SerilogLoggerFactory serilogLoggerFactory         = new SerilogLoggerFactory(dispose: true, providerCollection: loggerProviderCollection);
                    foreach (var provider in sp.GetServices <ILoggerProvider>())
                    {
                        serilogLoggerFactory.AddProvider(provider);
                    }
                    return(serilogLoggerFactory);
                });
            });
            return(builder, initializer);
        }
        /// <summary>
        /// Sets Serilog as the logging provider.
        /// Copied from https://github.com/serilog/serilog-aspnetcore/blob/dev/src/Serilog.AspNetCore/SerilogWebHostBuilderExtensions.cs
        /// </summary>
        /// <param name="builder">The web host builder to configure.</param>
        /// <param name="logger">The Serilog logger; if not supplied, the static <see cref="Serilog.Log"/> will be used.</param>
        /// <param name="dispose">When true, dispose <paramref name="logger"/> when the framework disposes the provider. If the
        /// logger is not specified but <paramref name="dispose"/> is true, the <see cref="Log.CloseAndFlush()"/> method will be
        /// called on the static <see cref="Log"/> class instead.</param>
        /// <param name="providers">A <see cref="LoggerProviderCollection"/> registered in the Serilog pipeline using the
        /// <c>WriteTo.Providers()</c> configuration method, enabling other <see cref="ILoggerProvider"/>s to receive events. By
        /// default, only Serilog sinks will receive events.</param>
        /// <returns>The host builder.</returns>
        public static IHostBuilder UseSerilog(
            this IHostBuilder builder,
            Serilog.ILogger logger             = null,
            bool dispose                       = false,
            LoggerProviderCollection providers = null)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            builder.ConfigureServices(collection =>
            {
                if (providers != null)
                {
                    collection.AddSingleton <ILoggerFactory>(services =>
                    {
                        var factory = new SerilogLoggerFactory(logger, dispose, providers);

                        foreach (var provider in services.GetServices <ILoggerProvider>())
                        {
                            factory.AddProvider(provider);
                        }

                        return(factory);
                    });
                }
                else
                {
                    collection.AddSingleton <ILoggerFactory>(services => new SerilogLoggerFactory(logger, dispose));
                }

                ConfigureServices(collection, logger);
            });

            return(builder);
        }
    /// <inheritdoc />
    public void Register(IConventionContext context, IConfiguration configuration, IServiceCollection services)
    {
        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }

        // removes default console loggers and such
        foreach (var item in services
                 .Where(
                     x => x.ImplementationType?.FullName?.StartsWith("Microsoft.Extensions.Logging", StringComparison.Ordinal) == true &&
                     x.ImplementationType?.FullName?.EndsWith("Provider", StringComparison.Ordinal) == true
                     )
                 .ToArray()
                 )
        {
            services.Remove(item);
        }

        LoggerProviderCollection?loggerProviders = null;

        if (_options.WriteToProviders)
        {
#pragma warning disable CA2000
            loggerProviders = new LoggerProviderCollection();
#pragma warning restore CA2000
        }

        services.AddSingleton <ILoggerFactory>(
            _ =>
        {
            var log = _.GetRequiredService <ILogger>();
            ILogger?registeredLogger = null;
            if (_options.PreserveStaticLogger)
            {
                registeredLogger = log;
            }
            else
            {
                // Passing a `null` logger to `SerilogLoggerFactory` results in disposal via
                // `Log.CloseAndFlush()`, which additionally replaces the static logger with a no-op.
                Log.Logger = log;
            }

            var factory = new SerilogLoggerFactory(registeredLogger, true, loggerProviders);

            if (_options.WriteToProviders)
            {
                foreach (var provider in _.GetServices <ILoggerProvider>())
                {
                    factory.AddProvider(provider);
                }
            }

            return(factory);
        }
            );

        if (context.Get <ILogger>() is { } logger)
        {
            services.AddSingleton(logger);
        }
Example #19
0
        // *******************************************************************
        // Public methods.
        // *******************************************************************

        #region Public methods

        /// <summary>
        /// This method adds standard serilog based logging strategies to the
        /// logging service.
        /// </summary>
        /// <param name="serviceCollection">The service collection to use for
        /// the operation.</param>
        /// <param name="serviceLifetime">The service lifetime to use for the operation.</param>
        /// <param name="configuration">The configuration to use for the operation.</param>
        /// <returns>The value of the <paramref name="serviceCollection"/>
        /// parameter, for chaining calls together.</returns>
        public static IServiceCollection AddSerilogLoggingStrategies(
            this IServiceCollection serviceCollection,
            IConfiguration configuration,
            ServiceLifetime serviceLifetime = ServiceLifetime.Scoped
            )
        {
            // Validate the parameters before attempting to use them.
            Guard.Instance().ThrowIfNull(serviceCollection, nameof(serviceCollection))
            .ThrowIfNull(configuration, nameof(configuration));

            // Get the application's friendly name.
            var friendlyName = AppDomain.CurrentDomain.FriendlyNameEx(true);

            // Create a logger configuration, for Serilog.
            var loggerConfiguration = new LoggerConfiguration();

            // Are we already pointed at the Serilog section?
            if (configuration.GetPath().EndsWith("Serilog"))
            {
                // If we get here then we have to back up a level because the
                //   Serilog method we'll use, to read the configuration section
                //   from, wants to move down, internally, into a 'Serilog' section,
                //   before it reads the configuration values.

                // Get the parent section.
                configuration = configuration.GetParentSection();
            }

            // How should we setup Serilog?
            if (configuration.GetChildren().Any())
            {
                // If we get here then we can setup Serilog logging services using
                //   whatever happens to be in the configuration section.

                // Setup serilog from the configuration.
                loggerConfiguration.ReadFrom.Configuration(
                    configuration
                    );
            }
            else
            {
                // If we get here then nothing was configured in the standard
                //   location for a Serilog logging service. So, we'll make some
                //   assumptions here and try to come up with a decent "default"
                //   configuration.

                // Setup serilog with defaults.
                loggerConfiguration
                .Enrich.WithExceptionDetails()
                .Enrich.FromLogContext()
                .WriteTo.Console(theme: AnsiConsoleTheme.Code)
                .WriteTo.File(
                    formatter: new RenderedCompactJsonFormatter(),
                    path: $"{friendlyName}-.log",
                    rollingInterval: RollingInterval.Day,
                    rollOnFileSizeLimit: true
                    );
            }

            // Either way, we want to add these enrichers.
            loggerConfiguration.Enrich.WithProperty("ApplicationName", friendlyName);
            loggerConfiguration.Enrich.WithProperty("MachineName", Environment.MachineName);
#if DEBUG
            loggerConfiguration.Enrich.WithProperty("DebuggerAttached", Debugger.IsAttached);
#endif
            // Register the logger configuration.
            serviceCollection.AddSingleton(loggerConfiguration);

            // Register a logger factory.
            serviceCollection.AddSingleton <ILoggerFactory>(services =>
            {
                // Get the logger configuration.
                var loggerConfiguration = services.GetRequiredService <LoggerConfiguration>();

                // Write our configuration out as providers.
                var providerCollection = new LoggerProviderCollection();
                loggerConfiguration.WriteTo.Providers(
                    providerCollection
                    );

                // Create the logger factory.
                var factory = new SerilogLoggerFactory(
                    null,
                    true,
                    providerCollection
                    );

                // Return the logger factory.
                return(factory);
            });

            // Create the static Serilog logger instance.
            Log.Logger = loggerConfiguration.CreateLogger();

            // Register the logger instance.
            serviceCollection.AddSingleton(Log.Logger);

            // Return the service collection.
            return(serviceCollection);
        }
        /// <summary>Sets Serilog as the logging provider.</summary>
        /// <remarks>
        /// A <see cref="HostBuilderContext"/> is supplied so that configuration and hosting information can be used.
        /// The logger will be shut down when application services are disposed.
        /// </remarks>
        /// <param name="builder">The host builder to configure.</param>
        /// <param name="configureLogger">The delegate for configuring the <see cref="Serilog.LoggerConfiguration" /> that will be used to construct a <see cref="Serilog.Core.Logger" />.</param>
        /// <param name="preserveStaticLogger">Indicates whether to preserve the value of <see cref="Serilog.Log.Logger"/>.</param>
        /// <param name="writeToProviders">By default, Serilog does not write events to <see cref="ILoggerProvider"/>s registered through
        /// the Microsoft.Extensions.Logging API. Normally, equivalent Serilog sinks are used in place of providers. Specify
        /// <c>true</c> to write events to all providers.</param>
        /// <returns>The host builder.</returns>
        public static IHostBuilder UseSerilog(
            this IHostBuilder builder,
            Action <HostBuilderContext, IServiceProvider, LoggerConfiguration> configureLogger,
            bool preserveStaticLogger = false,
            bool writeToProviders     = false)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            if (configureLogger == null)
            {
                throw new ArgumentNullException(nameof(configureLogger));
            }

            builder.ConfigureServices((context, collection) =>
            {
                LoggerProviderCollection loggerProviders = null;
                if (writeToProviders)
                {
                    loggerProviders = new LoggerProviderCollection();
                }

                collection.AddSingleton(services =>
                {
                    var loggerConfiguration = new LoggerConfiguration();

                    if (loggerProviders != null)
                    {
                        loggerConfiguration.WriteTo.Providers(loggerProviders);
                    }

                    configureLogger(context, services, loggerConfiguration);
                    var logger = loggerConfiguration.CreateLogger();

                    return(new RegisteredLogger(logger));
                });

                collection.AddSingleton(services =>
                {
                    // How can we register the logger, here, but not have MEDI dispose it?
                    // Using the `NullEnricher` hack to prevent disposal.
                    var logger = services.GetRequiredService <RegisteredLogger>().Logger;
                    return(logger.ForContext(new NullEnricher()));
                });

                collection.AddSingleton <ILoggerFactory>(services =>
                {
                    var logger = services.GetRequiredService <RegisteredLogger>().Logger;

                    ILogger registeredLogger = null;
                    if (preserveStaticLogger)
                    {
                        registeredLogger = logger;
                    }
                    else
                    {
                        // Passing a `null` logger to `SerilogLoggerFactory` results in disposal via
                        // `Log.CloseAndFlush()`, which additionally replaces the static logger with a no-op.
                        Log.Logger = logger;
                    }

                    var factory = new SerilogLoggerFactory(registeredLogger, true, loggerProviders);

                    if (writeToProviders)
                    {
                        foreach (var provider in services.GetServices <ILoggerProvider>())
                        {
                            factory.AddProvider(provider);
                        }
                    }

                    return(factory);
                });

                // Null is passed here because we've already (lazily) registered `ILogger`
                ConfigureServices(collection, null);
            });

            return(builder);
        }
Example #21
0
        public static void Main(string[] args)
        {
            // Creating a `LoggerProviderCollection` lets Serilog optionally write
            // events through other dynamically-added MEL ILoggerProviders.
            var providers = new LoggerProviderCollection();

            Log.Logger = new LoggerConfiguration()
                         .MinimumLevel.Debug()
                         .WriteTo.Console()
                         .WriteTo.Providers(providers)
                         .CreateLogger();

            var services = new ServiceCollection();

            services.AddSingleton(providers);
            services.AddSingleton <ILoggerFactory>(sc =>
            {
                var providerCollection = sc.GetService <LoggerProviderCollection>();
                var factory            = new SerilogLoggerFactory(null, true, providerCollection);

                foreach (var provider in sc.GetServices <ILoggerProvider>())
                {
                    factory.AddProvider(provider);
                }

                return(factory);
            });

            services.AddLogging(l => l.AddConsole());

            var serviceProvider = services.BuildServiceProvider();
            var logger          = serviceProvider.GetRequiredService <ILogger <Program> >();

            var startTime = DateTimeOffset.UtcNow;

            logger.LogInformation(1, "Started at {StartTime} and 0x{Hello:X} is hex of 42", startTime, 42);

            try
            {
                throw new Exception("Boom!");
            }
            catch (Exception ex)
            {
                logger.LogCritical("Unexpected critical error starting application", ex);
                logger.Log(LogLevel.Critical, 0, "Unexpected critical error", ex, null);
                // This write should not log anything
                logger.Log <object>(LogLevel.Critical, 0, null, null, null);
                logger.LogError("Unexpected error", ex);
                logger.LogWarning("Unexpected warning", ex);
            }

            using (logger.BeginScope("Main"))
            {
                logger.LogInformation("Waiting for user input");
                var key = Console.Read();
                logger.LogInformation("User pressed {@KeyInfo}", new { Key = key, KeyChar = (char)key });
            }

            var endTime = DateTimeOffset.UtcNow;

            logger.LogInformation(2, "Stopping at {StopTime}", endTime);

            logger.LogInformation("Stopping");

            logger.LogInformation(Environment.NewLine);
            logger.LogInformation("{Result,-10:l}{StartTime,15:l}{EndTime,15:l}{Duration,15:l}", "RESULT", "START TIME", "END TIME", "DURATION(ms)");
            logger.LogInformation("{Result,-10:l}{StartTime,15:l}{EndTime,15:l}{Duration,15:l}", "------", "----- ----", "--- ----", "------------");
            logger.LogInformation("{Result,-10:l}{StartTime,15:mm:s tt}{EndTime,15:mm:s tt}{Duration,15}", "SUCCESS", startTime, endTime, (endTime - startTime).TotalMilliseconds);

            serviceProvider.Dispose();
        }
Example #22
0
 public static IHostBuilder UseSerilog(this IHostBuilder builder, ILogger logger = null, bool dispose = false, LoggerProviderCollection providers = null)
 {
     return(SerilogHostBuilderExtensions.UseSerilog(builder, logger, dispose, providers));
 }
Example #23
0
        /// <summary>Sets Serilog as the logging provider.</summary>
        /// <remarks>
        /// A <see cref="HostBuilderContext"/> is supplied so that configuration and hosting information can be used.
        /// The logger will be shut down when application services are disposed.
        /// </remarks>
        /// <param name="builder">The host builder to configure.</param>
        /// <param name="configureLogger">The delegate for configuring the <see cref="Serilog.LoggerConfiguration" /> that will be used to construct a <see cref="Serilog.Core.Logger" />.</param>
        /// <param name="preserveStaticLogger">Indicates whether to preserve the value of <see cref="Serilog.Log.Logger"/>.</param>
        /// <param name="writeToProviders">By default, Serilog does not write events to <see cref="ILoggerProvider"/>s registered through
        /// the Microsoft.Extensions.Logging API. Normally, equivalent Serilog sinks are used in place of providers. Specify
        /// <c>true</c> to write events to all providers.</param>
        /// <remarks>If the static <see cref="Log.Logger"/> is a bootstrap logger (see
        /// <c>LoggerConfigurationExtensions.CreateBootstrapLogger()</c>), and <paramref name="preserveStaticLogger"/> is
        /// not specified, the the bootstrap logger will be reconfigured through the supplied delegate, rather than being
        /// replaced entirely or ignored.</remarks>
        /// <returns>The host builder.</returns>
        public static IHostBuilder UseSerilog(
            this IHostBuilder builder,
            Action <HostBuilderContext, IServiceProvider, LoggerConfiguration> configureLogger,
            bool preserveStaticLogger = false,
            bool writeToProviders     = false)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            if (configureLogger == null)
            {
                throw new ArgumentNullException(nameof(configureLogger));
            }

            // This check is eager; replacing the bootstrap logger after calling this method is not supported.
#if !NO_RELOADABLE_LOGGER
            var reloadable = Log.Logger as ReloadableLogger;
            var useReload  = reloadable != null && !preserveStaticLogger;
#else
            const bool useReload = false;
#endif

            builder.ConfigureServices((context, collection) =>
            {
                LoggerProviderCollection loggerProviders = null;
                if (writeToProviders)
                {
                    loggerProviders = new LoggerProviderCollection();
                }

                collection.AddSingleton(services =>
                {
                    ILogger logger;
#if !NO_RELOADABLE_LOGGER
                    if (useReload)
                    {
                        reloadable !.Reload(cfg =>
                        {
                            if (loggerProviders != null)
                            {
                                cfg.WriteTo.Providers(loggerProviders);
                            }

                            configureLogger(context, services, cfg);
                            return(cfg);
                        });

                        logger = reloadable.Freeze();
                    }
                    else
#endif
                    {
                        var loggerConfiguration = new LoggerConfiguration();

                        if (loggerProviders != null)
                        {
                            loggerConfiguration.WriteTo.Providers(loggerProviders);
                        }

                        configureLogger(context, services, loggerConfiguration);
                        logger = loggerConfiguration.CreateLogger();
                    }

                    return(new RegisteredLogger(logger));
                });

                collection.AddSingleton(services =>
                {
                    // How can we register the logger, here, but not have MEDI dispose it?
                    // Using the `NullEnricher` hack to prevent disposal.
                    var logger = services.GetRequiredService <RegisteredLogger>().Logger;
                    return(logger.ForContext(new NullEnricher()));
                });

                collection.AddSingleton <ILoggerFactory>(services =>
                {
                    var logger = services.GetRequiredService <RegisteredLogger>().Logger;

                    ILogger registeredLogger = null;
                    if (preserveStaticLogger)
                    {
                        registeredLogger = logger;
                    }
                    else
                    {
                        // Passing a `null` logger to `SerilogLoggerFactory` results in disposal via
                        // `Log.CloseAndFlush()`, which additionally replaces the static logger with a no-op.
                        Log.Logger = logger;
                    }

                    var factory = new SerilogLoggerFactory(registeredLogger, !useReload, loggerProviders);

                    if (writeToProviders)
                    {
                        foreach (var provider in services.GetServices <ILoggerProvider>())
                        {
                            factory.AddProvider(provider);
                        }
                    }

                    return(factory);
                });

                // Null is passed here because we've already (lazily) registered `ILogger`
                ConfigureServices(collection, null);
            });

            return(builder);
        }