асинхронный приемник serilog не сбрасывает буфер на диск при завершении работы - PullRequest
2 голосов
/ 19 сентября 2019

При использовании асинхронного приемника serilog с приемником файлов (и buffered = true) записи журнала теряются при завершении работы.Я предполагаю, что это буфер не сбрасывается на диск, хотя он и вызывается.Я не уверен, почему это происходит, но я почти уверен, что это асинхронный приемник.Если я удаляю его из конфигурации и просто использую приемник файлов сам по себе, журнал сбрасывается на диск, как и ожидалось.

У меня довольно простая настройка.

program.cs:

 public class Program
{
    public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
        .AddEnvironmentVariables()
        .Build();

    public static void Main(string[] args)
    {

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

        try
        {
            Log.Information("Starting the web host");

            CreateWebHostBuilder(args).Build().Run();

            Log.Information("Shutting down the web host");

        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Host terminated unexpectedly");

        }
        finally
        {
            Log.Information("Closing Log");

            Log.CloseAndFlush();
        }



    }

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

}

appsettings.json

    {
  "Serilog": {
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Information",
        "System": "Warning"
      }
    }
  },
  ...

appsettings.Development.json

{
  "Serilog": {
    "WriteTo": [
      {
        "Name": "Async",
        "Args": {
          "configure": [
            {
              "Name": "Console",
              "Args": {
                "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",
                "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}"
              }
            },
            {
              "Name": "File",
              "Args": {
                "path": "logs/log.txt",
                "formatter": "Serilog.Formatting.Json.JsonFormatter",
                "rollingInterval": "Day",
                "retainedFileCountLimit": 7,
                "buffered": true
              }
            }
          ]
        }
      }
    ]
  }
}

Если поставить точку остановав строке Log.CloseAndFlush () он срабатывает при завершении работы, но фактически не сбрасывает буфер на диск.

Есть идеи?

1 Ответ

2 голосов
/ 19 сентября 2019

Вы должны организовать свою конфигурацию в следующем формате.

"WriteTo": [
  {
    "Name": "Async",
    "Args": {
      "configure": [
        {
          "Name": "Console",
          "Args": {
            "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console",
            "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}"
          }
        }
      ]
    }
  },
  {
    "Name": "Async",
    "Args": {
      "configure": [
        {
          "Name": "File",
          "Args": {
            "path": "logs/log.txt",
            "formatter": "Serilog.Formatting.Json.JsonFormatter",
            "rollingInterval": "Day",
            "retainedFileCountLimit": 7,
            "buffered": true
          }
        }
      ]
    }
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...