Как мне настроить Serilog aspnetcore с приемником Seq?

Я не могу получить операторы журнала в Seq из моего приложения.net core 2.2, размещенного в IIS. Журналы появляются, когда я отлаживаю и запускаю приложение с помощью IISExpres. Однако только журналы RequestLogging отображаются в Seq, когда приложение запускается из пула приложений реального IIS. Я скучаю по своим журналам.

Вот что я сделал:

  1. Установлены пакеты Nuget Serilog, Serilog.Aspnetcore и Serilog.Sinks.Seq.

  2. Удалены все Microsoft.Extensions.Logging и ссылки.

  3. Реализована встроенная конфигурация в Program.cs в соответствии с образцом на странице Serilog.Aspnetcore Github:

public class Program
{
      ...

      public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseSerilog((hostingContext, loggerConfiguration) =>
                       loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration)
                        , preserveStaticLogger: true, writeToProviders: false);


}
  1. Добавлено логирование запросов в Startup.cs:
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            ....

            app.UseHttpsRedirection();
            app.UseSerilogRequestLogging();
            app.UseMvc();
        }
  1. Настроен Serilog в appsettings.json, поэтому apiKey и Seq serverUrl можно настроить при развертывании с помощью Azure DevOps для сред разработки, тестирования и производства:
{
  "Serilog": {
    "Using": [ "Serilog.Sinks.Seq" ],
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "Enrich": [ "FromLogContext" ],
    "WriteTo": [
      {
        "Name": "Seq",
        "Args": {
          "apiKey": "iVPcw1...",
          "serverUrl": "http://localhost:5341"
        }
      }
    ]
  },
    ...
}
  1. Добавлен логгер и инициализация в классах как обычно:
     public class SomeService : ISomeService
     {
        private readonly ILogger logger;
        ...

        public SomeService( ...injections...) {

            logger = Log.ForContext<SomeService>();
            ...
        }

        ...
        public async Task ServiceMethod(Data d) 
        {
            logger.Information("ServiceMethod called with {@d}");
        }

        ...
    }

1 ответ

Среди аргументов UseSerilog() у тебя есть:

preserveStaticLogger: true

Это инструктирует UseSerilog() не устанавливать / изменять статический Log.Logger instance, что означает, когда вы используете его в:

logger = Log.ForContext<SomeService>();

вы получите по умолчанию ненастроенный, ничего не делающий регистратор.

Настройка preserveStaticLogger: false должен это исправить.

Другие вопросы по тегам