OmatoSoup
OmatoSoup

Reputation: 285

How to overwrite application name specified in appsettings.json when using Serilog?

My appsettings.json looks like this:

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.File" ],
    "MinimumLevel": "Debug",
    "WriteTo": [
      {

              "Name": "File",
              "Args": {

                "path": "%APPDATA%\\FancyProject\\logs\\RR.log",
                "formatter": "Serilog.Formatting.Json.JsonFormatter",
                "rollingInterval": "Day",
                "retainedFileCountLimit": 20,
                "buffered": false
              }
            }
          ],
    "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId", "WithExceptionDetails" ],
    "Properties": {
      "Application": "SampleName"
    }
  }
}

Loading the settings:

var configuration = new ConfigurationBuilder()
                        .AddJsonFile("appsettings.json")
                        .Build();

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

I'd like to use the same config file for multiple projects in my solution but with a different application name in order to distinguish between services.

Is there a way to change the application name ("SampleName" in my config) in code when loading the config?

Upvotes: 4

Views: 4520

Answers (2)

Pavel Anikhouski
Pavel Anikhouski

Reputation: 23258

You can use the following extension method for IConfiguration interface to update the configuration instance after reading it from appsettings.json

public static class Ext
{
    public static IConfiguration ApplyAppName(this IConfiguration configuration, string appName)
    {
        foreach (var (key, _) in configuration.AsEnumerable())
            if (key.StartsWith("Serilog") && key.EndsWith("Application"))
                configuration[key] = appName;

        return configuration;
    }
}

And use it in following way (based on serilog-settings-configuration sample from GitHub) before configuring and creating a logger

var configuration = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json")
    .Build()
    .ApplyAppName("MyApp");

var logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration)
    .CreateLogger();

Alternatively, you can follow Serilog integration for ASP.NET Core 2+ and use UseSerilog() method with the above ApplyAppName extension during CreateHostBuilder call

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); })
        .UseSerilog((hostingContext, loggerConfiguration) =>
        {
            var config = hostingContext.Configuration.ApplyAppName("MyApp");
            loggerConfiguration.ReadFrom.Configuration(config);
        });

Upvotes: 2

OmatoSoup
OmatoSoup

Reputation: 285

I solved it by removing the Properties section from the config and load it this way:

Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(configuration)
            .Enrich.WithProperty("ApplicationName", "my application")
            .CreateLogger();

PavelAnikhouski's (deleted) answer was actually the correct answer to my question but I think directly adding the correct application name is cleaner than modifying a placeholder.

Upvotes: 2

Related Questions