Serilog: RollingFile не работает в ядре asp.net с appsettings.json - PullRequest
1 голос
/ 28 июня 2019

Я использую ядро ​​asp.net (веб-сайт) и Serilog для регистрации.

Установленные пакеты Nuget:

Serilog
Serilog.AspNetCore
Serilog.Extensions.Logging
Serilog.Extensions.Logging.File
Serilog.Settings.Configuration
Serilog.Sinks.File
Serilog.Sinks.RollingFile
Microsoft.Extensions.Logging

Настройки в файле Main.cs:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
             .ConfigureAppConfiguration((WebHostBuilderContext, configurationBuilder) =>
             {
                 configurationBuilder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
                 configurationBuilder.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true);
                 configurationBuilder.AddEnvironmentVariables();
             })
             .ConfigureLogging((hostingContext, loggingBuilder) =>
             {
                 loggingBuilder.ClearProviders();
                 loggingBuilder.AddSerilog();
             })
            .UseStartup<Startup>();  
}

Что работает:

В Startup.csфайл, если я напишу следующий код, файл регистрации создается.Здесь я указываю конфигурации в самом коде.

  public void Configure(IApplicationBuilder app,
                                IHostingEnvironment env,
                                ILoggerFactory loggerFactory)
    {
     string logFilePath = Path.Combine(env.ContentRootPath, "Logs/ImportManager2-{Date}.txt");

    Log.Logger = new LoggerConfiguration()
       .MinimumLevel.Debug()
       .WriteTo.RollingFile(logFilePath)
       .CreateLogger();

     loggerFactory.AddSerilog();

     --
     --
    }

Когда я использую файл appsettings.json со следующим содержимым

{
  "Logging": {
    "LogLevel": {
      "Default": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MyDatabaseLocal": "Server=_;Database=_;MultipleActiveResultSets=true;Connection Timeout=333;Integrated Security=SSPI",
    "OtherDatabaseLocal": "Server=_;Database=_;MultipleActiveResultSets=true;Connection Timeout=333;Integrated Security=SSPI"
  },
  "Serilog": {
    "MinimumLevel": "Debug",
    "Override": {
      "Microsoft": "Warning"
    },
    "Using": [
      "Serilog.Sinks.Console",
      "Serilog.Sinks.File"
    ],
    "WriteTo": [
      {
        "Name": "RollingFile",
        "Args": {
          "path": "Logs/MyProject.txt"
        }
      }
    ]
  }
}

и изменил файл startup.cs как

public void Configure(IApplicationBuilder app,
                            IHostingEnvironment env,
                            ILoggerFactory loggerFactory)
{

 Log.Logger = new LoggerConfiguration()
             .ReadFrom.Configuration(Configuration.GetSection("Serilog"))
             .CreateLogger();

 loggerFactory.AddSerilog();
 --
 --
}

После этого не создается файл.В чем может быть проблема.

1 Ответ

1 голос
/ 28 июня 2019

Следующий вызов не совсем работает, как вы ожидаете:

.ReadFrom.Configuration(Configuration.GetSection("Serilog"))

При использовании этого метода расширения Serilog ожидает, что в конфигурации, которую вы передаете через , будет раздел с именем Serilog . В вашем примере вы пропускаете сам раздел Serilog, но затем он ищет другой Serilog раздел в этом .

Обновите вызов так, чтобы он просто проходил через Configuration, например:

.ReadFrom.Configuration(Configuration)

Serilog найдет ваш раздел Serilog и использует настройки из этого.

...