Как использовать Serilog в приложении .NET Core Console - PullRequest
2 голосов
/ 11 октября 2019

Я хотел, чтобы мое приложение имело возможность записи в файл, поэтому я начал искать что-то большее, чем стандартная среда ведения журналов .NET Core 2.2. Я вижу, что Serilog может сделать эту работу. Однако я не могу найти документ о том, как настроить Serilog в приложении .NET Core Console с помощью Dependency Injection. Все, что я вижу, это материалы ASP.NET, что, вероятно, не то, что мне нужно.

Я начал делать это сам. Я установил (Nuget):

  • Serilog
  • Serilog.Extensions.Logging
  • Serilog.Sinks.File
  • Serilog.Sinks.Console (использовать Serilog для всех моих журналов)

Я создал расширение для ServiceCollection

        public static void AddLogging(this IServiceCollection services, Microsoft.Extensions.Logging.LogLevel logLevel)
        {
            var serilogLogger = new LoggerConfiguration()
            .WriteTo.Console()
            .WriteTo.File("log.txt")
            .CreateLogger();

            services.AddLogging(builder =>
            {
                builder.SetMinimumLevel(logLevel);
                builder.AddSerilog(logger: serilogLogger, dispose: true);
            });
        }

Регистрация работает, однако:

  • уровень журналаэто не то, что я установил. Кажется, что Serilog использует уровень INFO, хотя я хотел иметь DEBUG. Почему мои настройки не соблюдаются? В конце концов, я все еще использую инфраструктуру ведения журналов NET Core, поэтому я использую ее для настройки уровня ведения журнала
  • , правильно ли я делаю эту настройку? Я не совсем уверен, должно ли dispose быть true. Как правило, я хочу, чтобы среда внедрения зависимостей NET Core позаботилась об удалении услуг.

1 Ответ

1 голос
/ 11 октября 2019

Я не уверен насчет builder.SetMinimumLevel (он не использует перечисление Serilog).

Мы устанавливаем уровень логгера при создании объекта LoggerConfiguration.

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Debug) // restricted... is Optional
    (...)
    .CreateLogger();

Кстати. Стоит отметить следующий раздел из Основы конфигурации

Регистратор против минимума приемника - важно понимать, что уровень ведения журнала может быть повышен толькодля раковин, не опущенных. Таким образом, если для MinimumLevel средства ведения журнала установлено значение «Информация», то приемник с отладкой в ​​качестве указанного уровня будет по-прежнему видеть только события уровня информации. Это связано с тем, что конфигурация уровня журналирования контролирует, какие операторы журналирования приведут к созданию событий, а конфигурация уровня приемника только фильтрует их. Чтобы создать отдельный регистратор с более подробным уровнем, используйте отдельную конфигурацию LoggerConfiguration.


Я не уверен насчет builder.AddSerilog.

Вот что мне подходит.

using Serilog;

(...)

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

(...)

return new HostBuilder()
      .ConfigureHostConfiguration(...)
      .ConfigureServices(...)
      .UseSerilog();
...