Как переписать имя приложения, указанное в appsettings. json при использовании Serilog? - PullRequest
2 голосов
/ 27 марта 2020

Мои настройки приложений. json выглядит следующим образом:

{
  "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"
    }
  }
}

Загрузка настроек:

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

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

Я хотел бы использовать один и тот же файл конфигурации для нескольких проектов в моем решение, но с другим именем приложения, чтобы различать guish между службами.

Есть ли способ изменить имя приложения ("SampleName" в моей конфигурации) в коде при загрузке конфигурации?

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Вы можете использовать следующий метод расширения для интерфейса IConfiguration, чтобы обновить экземпляр конфигурации после чтения его из 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;
    }
}

И использовать его следующим образом (на основе на serilog-settings-configuration * (1009 * пример из GitHub) перед настройкой и созданием регистратора

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

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

В качестве альтернативы, вы можете следовать Интеграция Serilog для ASP. NET Core 2+ и использовать метод UseSerilog() с указанным выше расширением ApplyAppName во время CreateHostBuilder вызова

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);
                });
0 голосов
/ 03 апреля 2020

Я решил это, удалив раздел «Свойства» из конфигурации и загрузив его следующим образом:

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

Ответ (удаленный) Павла Анниховского был фактически правильным ответом на мой вопрос, но я думаю, что добавление правильного приложения напрямую имя чище, чем изменение заполнителя.

...