14

I am attempting to load my Serilog configuration from appsettings.json using the Serilog.Settings.Configuration prerelease NuGet package. However when I load it using Configuration.GetSection, the value continues to come back as null.

Here is what I have in my Program.cs file:

    return WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .ConfigureLogging(
        (hostingContext, loggingBuilder) =>
        {
            loggingBuilder.ClearProviders();
            loggingBuilder.AddSerilog(
                new LoggerConfiguration()
                    .ReadFrom.ConfigurationSection(hostingContext.Configuration.GetSection("Serilog"))
                    .CreateLogger()
            );
        }
    );

Here is what I have in my appsettings.json file:

    {
    "Serilog": {
        "Using": [ "Serilog.Sinks.MSSqlServer" ],
        "MinimumLevel": {
            "Default": "Verbose",
            "Override": {
                "Microsoft": "Verbose",
                "System": "Verbose",
                "Microsoft.AspNetCore.Authentication": "Verbose"
            }
        },
        "WriteTo": [
            {
                "Name": "MSSqlServer",
                "Args": {
                    "connectionString": "*my_connectionString*",
                    "tableName": "ErrorLog"
                }
            }
        ]
    }}

NuGet packages installed:

  • Microsoft.AspNetCore.App v2.1.1
  • Serilog v2.7.1
  • Serilog.AspNetCore v2.1.1
  • Serilog.Extensions.Logging v2.0.2
  • Serilog.Settings.Configuration v3.0.0-dev-00119
  • Serilog.Sinks.MSSqlServer v5.1.2
Simon Hooper
  • 1,049
  • 8
  • 10
j-hurst
  • 289
  • 1
  • 3
  • 12

3 Answers3

26

I configure it like that:

return WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration
                .ReadFrom.Configuration(hostingContext.Configuration))
            .Build();

by default Serilog look for Serilog section in configuration

agua from mars
  • 16,428
  • 4
  • 61
  • 70
  • 1
    Be aware that this way you won't be able to log any exceptions happening at startup. Details: https://github.com/serilog/serilog-aspnetcore#inline-initialization – torvin Dec 25 '20 at 00:45
11

I configured like this

public static void Main(string[] args)
{
    var _config = new ConfigurationBuilder()
                .AddJsonFile("loggerconfig.json") //mantained separate config file
                .Build();

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

    CreateWebHostBuilder(args).Build().Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseSerilog()
        .UseStartup<Startup>();

and this is the better way according to Serilog.

Chris Moutray
  • 18,029
  • 7
  • 45
  • 66
Manjunatha DL
  • 286
  • 3
  • 11
  • `and this is the better way according to Serilog.` It is not correct any longer: https://github.com/serilog/serilog-aspnetcore/blob/dev/samples/Sample/Program.cs – Shahar Shokrani Nov 09 '22 at 08:27
2

Here is how I did it to read from logging.json:

            var builder = new ConfigurationBuilder()
                .AddJsonFile(path: "logging.json", optional: false, reloadOnChange: true);

            var config = builder.Build();
            Log.Logger = new LoggerConfiguration()
                        .Enrich.With(new EventBusLogEnricher())
                        .ReadFrom.Configuration(config)
                        .CreateLogger();
Saher Ahwal
  • 9,015
  • 32
  • 84
  • 152