Serilog Net Core 3.1 не создает никаких файлов журналов - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть. NET Проект Core 3.1, и я использую Serilog для управления журналами. Этот проект развернут на сервере windows под управлением IIS. Кроме того, у меня есть файловый сервер для хранения файлов журнала. Пользователь IIS имеет разрешения на чтение и запись на этом файловом сервере, так как на этом сервере уже есть другие веб-приложения. Серверы видны и доступны между ними.

Я реализовал Serilog следующим образом:

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

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args) 
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                    webBuilder.UseIISIntegration();
                })
                .ConfigureAppConfiguration((context, builder) =>
                {
                    // Here I recover the configuration correctly
                    var configuration = GetConfiguration();
                })
                .UseSerilog((hostingContext, loggerConfiguration) => 
                {
                     // hostingContext.Configuration.GetLogOuput() is a custom extension methods.
                     var pathLogFile = Path.Combine(hostingContext.Configuration.GetLogOutput(), hostingContext.HostingEnvironment.ApplicationName, "concurrentFlat.json");

                    if (hostingContext.HostingEnvironment.IsDevelopment())
                    {
                        loggerConfiguration
                          .MinimumLevel.Debug()
                          .Enrich.FromLogContext()
                          .Enrich.WithMachineName()
                          .Enrich.WithEnvironmentUserName()
                          .Enrich.WithProcessId()
                          .Enrich.WithProcessName()
                          .Enrich.WithThreadId()
                          .Enrich.WithProperty("ApplicationName", hostingContext.HostingEnvironment.ApplicationName)
                          .Enrich.WithProperty("Environment", hostingContext.HostingEnvironment.EnvironmentName)
                          .WriteTo.Console()
                          .WriteTo.File(
                              path: pathLogFile,
                              formatter: new CompactJsonFormatter(),
                              rollOnFileSizeLimit: true,
                              fileSizeLimitBytes: 10000000
                          );
                    }
                    else
                    {
                        loggerConfiguration
                             .MinimumLevel.Information()
                             .Enrich.FromLogContext()
                             .Enrich.WithMachineName()
                             .Enrich.WithEnvironmentUserName()
                             .Enrich.WithProcessId()
                             .Enrich.WithProcessName()
                             .Enrich.WithThreadId()
                             .Enrich.WithProperty("ApplicationName", hostingContext.HostingEnvironment.ApplicationName)
                             .Enrich.WithProperty("Environment", hostingContext.HostingEnvironment.EnvironmentName)
                             .WriteTo.File(
                                 path: pathLogFile,
                                 formatter: new CompactJsonFormatter(),
                                 rollOnFileSizeLimit: true,
                                 fileSizeLimitBytes: 10000000
                             );
                    }
                });
}

С конфигурацией разработки все работает правильно, и когда я пытаюсь смоделировать поведение приложения , всегда на моем локальном компьютере, в производственной среде (установка переменной среды ASPNETCORE_ENVIRONMENT в производство) поведение является ожидаемым. Этот метод: hostingContext.Configuration.GetLogOutput () считывает путь к файловому серверу из переменной среды. Я подтвердил, что это правильно, но файлы не создаются.

Вот фрагмент кода, в котором я использую. NET Базовый интерфейс ILoggger:

using Microsoft.Extensions.Logging;

public class FooController : Controller
{
    private readonly ILogger<FooController> _logger;

    public FooController(ILogger<FooController> logger) 
    {
        _logger = logger;
    }

    public async Task<IActionResult> Get() 
    {
        _logger.LogError("Test Error log");
         return Ok();
    }
}

Есть ли у вас Любая идея, почему файл журнала не создается на файловом сервере?

Заранее спасибо

1 Ответ

0 голосов
/ 28 апреля 2020

Я проверил ваш код и, похоже, работал довольно хорошо. Итак, вы можете проверить список ниже, чтобы увидеть, если что-то отличается от моего,

  1. пакет версия
  <ItemGroup>
    <PackageReference Include="Serilog.AspNetCore" Version="3.2.0" />
    <PackageReference Include="Serilog.Enrichers.Environment" Version="2.1.3" />
    <PackageReference Include="Serilog.Enrichers.Process" Version="2.0.1" />
    <PackageReference Include="Serilog.Enrichers.Thread" Version="3.1.0" />
    <PackageReference Include="Serilog.Extensions.Logging.File" Version="2.0.0" />
  </ItemGroup>
используйте тривиальный путь к журналу для замены переменной pathLogFile для тестирования
public static class CustomConfigurationExtension
{
    public static string GetLogOutput(this IConfiguration config) => "log";
}  
setup trivial appsettings. json путь для другой среды (Development, Production, et c) для тестирования

Startup.cs

.ConfigureHostConfiguration(config =>
{
    config.SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
        .AddEnvironmentVariables();
})
используйте этот appsetting. json для тестирования

appsettings. json

{
  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    }
  },
  "AllowedHosts": "*"
}

Большинство приведенных выше примеров я просто следовал serilog EarlyInitializationSample в github. Вот все, что я проверял. Надежда помогает.

Program.cs

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
            webBuilder.UseIISIntegration();
        })
        .ConfigureHostConfiguration(config =>
        {
            config.SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
                .AddEnvironmentVariables();
        })
        .UseSerilog((hostingContext, loggerConfiguration) =>
        {
            var pathLogFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
                hostingContext.Configuration.GetLogOutput(), 
                hostingContext.HostingEnvironment.ApplicationName,
                "concurrentFlat.json"
            );

            if (hostingContext.HostingEnvironment.IsDevelopment())
            {
                loggerConfiguration
                  .MinimumLevel.Debug()
                  .Enrich.FromLogContext()
                  .Enrich.WithMachineName()
                  .Enrich.WithEnvironmentUserName()
                  .Enrich.WithProcessId()
                  .Enrich.WithProcessName()
                  .Enrich.WithThreadId()
                  .Enrich.WithProperty("ApplicationName", hostingContext.HostingEnvironment.ApplicationName)
                  .Enrich.WithProperty("Environment", hostingContext.HostingEnvironment.EnvironmentName)
                  .WriteTo.Console()
                  .WriteTo.File(
                      path: pathLogFile,
                      rollingInterval: RollingInterval.Day,
                      formatter: new CompactJsonFormatter(),
                      rollOnFileSizeLimit: true,
                      fileSizeLimitBytes: 10000000
                  );
            }
            else
            {
                loggerConfiguration
                     .MinimumLevel.Information()
                     .Enrich.FromLogContext()
                     .Enrich.WithMachineName()
                     .Enrich.WithEnvironmentUserName()
                     .Enrich.WithProcessId()
                     .Enrich.WithProcessName()
                     .Enrich.WithThreadId()
                     .Enrich.WithProperty("ApplicationName", hostingContext.HostingEnvironment.ApplicationName)
                     .Enrich.WithProperty("Environment", hostingContext.HostingEnvironment.EnvironmentName)
                     .WriteTo.File(
                         path: pathLogFile,
                         formatter: new CompactJsonFormatter(),
                         rollOnFileSizeLimit: true,
                         fileSizeLimitBytes: 10000000
                     );
            }
        });
...