Kivo
Kivo

Reputation: 435

Serilog override settings in appsettings.production with Net Core 2.2

I have an issue with serilog when i want to write to a database based on different environments. Serilog override my appsettings.production.json and always take the settings in appsettings.json instead even in a production mode !

My code in my local appsettings.json

"Serilog": {
        "Using": [ "Serilog.Sinks.MSSqlServer" ],
        "MinimumLevel": {
            "Default": "Debug",
            "Override": {
                "Microsoft": "Warning",
                "System": "Warning"
            }
        },
        "WriteTo": {
          "Console" : {"Name": "Console"},
          "Sql": {
             "Name": "MSSqlServer",
             "Args": {
                "connectionString": "Server=MyServerInDev\\SQLSERVER;Database=MyDBDev;user id=ui;password=pw_;ConnectRetryCount=0;MultipleActiveResultSets=true",
                "tableName": "Log",
                "autoCreateSqlTable": true
            }
        }
    }, 

appsettings.production.json

"Serilog": {
        "Using": [ "Serilog.Sinks.MSSqlServer" ],
        "MinimumLevel": {
            "Default": "Warning",
            "Override": {
                "Microsoft": "Warning",
                "System": "Warning"
            }
        },
        "WriteTo": {
          "Console" : {"Name": "Console"},
          "Sql": {
             "Name": "MSSqlServer",
             "Args": {
                "connectionString": "Server=MyServerInProd\\SQLSERVER;Database=MyDBProdv;user id=ui;password=pw_;ConnectRetryCount=0;MultipleActiveResultSets=true",
                "tableName": "Log",
                "autoCreateSqlTable": true
            }
        }
    },

My program.cs

var configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                 .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
                .AddEnvironmentVariables()
                .Build();

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

I am missing something ? and why serilog take the appsettings.json settings and not appsettings.production.json even in prod mode

Note that the other settings in the appsettings.production.json work fine. Only the settings in serilog is causing the problem

Upvotes: 2

Views: 3039

Answers (1)

Niksr
Niksr

Reputation: 539

Found it. The reason is that Serilog adds sink configs to array, and each of two files of appsettings just adds another sinks instead of replacing them. Solution is explicitly indicate array indexes for each sink. Credits for answer: nblumhardt. Tested, works.

"WriteTo": {
  "0": {
    "Name": "File",
    "Args": {
      "path": "./logs/myapp-.txt",
      "rollingInterval": "Day"
    }
  }
},

Upvotes: 3

Related Questions