.net core 2.2, Чтение настроек из пользовательских секретов для serilog - PullRequest
0 голосов
/ 21 мая 2019

Я установил свое решение, и serilog считывает значения из appsettings.json

public void Configure(IApplicationBuilder application, IHostingEnvironment environment, ILoggerFactory loggerFactory)
{
     Logger log = new LoggerConfiguration()
            .ReadFrom.Configuration(Configuration)
            .CreateLogger();
     loggerFactory.AddSerilog(log);

И appsettings выглядит так:

 "Serilog": {
    "Using": [ "Serilog.Sinks.Slack", "Serilog.Sinks.ApplicationInsights" ],
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Error",
        "System": "Error"
      }

    },
    "WriteTo": [
      {
        "Name": "Slack",
        "Args": {
          "WebHookUrl": "https://hooks.slack.com/services/xxx/yyy/zzz",
          "CustomChannel": "#channel"
        }
      },
      {
        "Name": "ApplicationInsights",
        "Args": {
          "InstrumentationKey": "xxx-xxx-xxx-xxx-xxx",
          "restrictedToMinimumLevel": "Information",
          "telemetryConverter": "Serilog.Sinks.ApplicationInsights.Sinks.ApplicationInsights.TelemetryConverters.TraceTelemetryConverter, Serilog.Sinks.ApplicationInsights"
        }
      }
    ]
  }

Так что пока все в порядке, но я не хочу хранить секреты, такие как webhook и InstrumentationKey, в моем хранилище. Я хочу прочитать их из безопасного места, такого как пользовательские секреты в среде разработки и Key-vault при разработке. Как я могу изменить его, чтобы заменить значения из usersecrets?

https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-2.2&tabs=windows

Есть ли в любом случае конфигурация автоматически перезаписывается?

Если нет, я знаю, что могу прочитать свою конфигурацию из секретов, скажем, как

  webHookUrl = Configuration["Serilog:WriteTo:Slack:WebHookUrl"];

Но тогда как мне применить его к loggerConfig? Я имею в виду, что writeTo часть является динамической от настроек, я должен тогда добавить это в код вместо этого? : \

Обновление

Так как многие люди спрашивали, в моем program.cs у меня есть:

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

И, основываясь на документации Microsoft, все должно работать, потому что у меня CreateDefaultBuilder, и я использую .net core 2.2. https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-2.2&tabs=windows#access-a-secret

В ASP.NET Core 2.0 или более поздней версии источник конфигурации пользовательских секретов автоматически добавляется в режиме разработки, когда проект вызывает CreateDefaultBuilder , чтобы инициализировать новый экземпляр хоста с предварительно настроенными значениями по умолчанию. CreateDefaultBuilder вызывает AddUserSecrets, когда EnvironmentName является разработкой.

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

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Я скопировал те же самые точные настройки в свои секреты и удалил их из моих настроек приложения, но теперь я не получаю никаких журналов. Я что-то пропустил?

Если вы переместите свои конфигурации Serilog с appsettings.json на secrets.json, вам нужно изменить ReadFrom.Configuration() в Configure для чтения из секретного файла. Json.

var configuration = new ConfigurationBuilder()
          .AddJsonFile("C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\UserSecrets\\aspnet-SerilogCore\\secrets.json")
          .Build();//Replace above with path of your secrets.json

Logger log = new LoggerConfiguration()
            .ReadFrom.Configuration(configuration)
            .CreateLogger();
loggerFactory.AddSerilog(log);
0 голосов
/ 21 мая 2019

Вы можете использовать IOptions для этого

Сначала мне нужно определить модель для хранения необходимой мне информации

    public class AssetSettings
    {
        public string StorePath { get; set; }
        public string AssetPath { get; set; }
        public string GoogleDriveStorePath { get; set; }
    }

Затем мне нужно зарегистрировать конфигурацию в Startup.cs

services.Configure<AssetSettings>(configuration.GetSection("AssetSettings"));

И в моем сервисе я могу просто прочитать мой конфиг с этой конфигурацией

private readonly IOptions<AssetSettings> _assetSettings;

public SettingsRepository(
            IOptions<AssetSettings> assetSettings)
        {
            _assetSettings = assetSettings;
        }

Затем просто позвонить

_assetSettings.Value.StorePath
...