Как настроить Serilog с разными уровнями журналов для каждого пространства имен в моем проекте? Я хочу сделать это через конфигурационный файл application.json

Мы пишем новые функции ведения журналов и внедряем их в существующие службы.

Вот как мы это делаем:

1) Настройте Serilog с помощью вызова UseSerilog() в Program.cs

2) Настройте конфигурацию Serilog в appsettings.json, чтобы настроить приемники для записи в файл журнала.

3) Написал класс пользовательского регистратора фасада, который выполняет внутреннюю регистрацию с использованием экземпляра глобального журнала Serilog.

public class MyLogger<T> : IMyLogger<T>
public MyLogger()
    {
        _logger = Log.ForContext(typeof(T));
    }
public void LogInformation(Exception ex)
    {
        _logger.Information(ex.Message);
    }

4) Внедрить IMyLogger во все мои существующие службы через DI

5) Зарегистрируйте все службы (Регистратор, службы, связанные с проектом) в ConfigureServices()

Все работает. Но я хочу установить разные уровни журналов для разных пространств имен в моем приложении, чтобы в производственной среде я мог просто установить в конфигурации только 4-5 важных основных пространств имен, чьи вызовы метода ведения журнала (MyLogger.LogInformation()) будут отправлены в файл журнала.

Возможно ли что-то подобное ниже? Потому что MyLogger - это класс, который ведет журнал. Но если вызов поступает из пространства имен MyProject.CartManager, он должен автоматически регистрироваться на основе конфигурации ниже в примере.

Пожалуйста, поделитесь своими мыслями.

например:

"Serilog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": {
  "Default": "Information",
  "Override": {
    "Microsoft": "Warning",
    "System": "Information",
    "MyProject.Inventory":  "Information"
    "MyProject.CartManager":  "Error"
  }
}

2 ответа

Как вы и предложили в своей конфигурации. Это возможно. Ниже приведен пример конфигурации.

      "serilog": {
"Using": [ "Serilog.Sinks.Console" ],
"MinimumLevel": {
  "Default": "Information",
  "Override": {
    "Microsoft": "Warning",
    "Microsoft.Hosting.Lifetime": "Information"
  }
},
"WriteTo": [
  {
    "Name": "Console",
    "Args": {
      "formatter": "Serilog.Formatting.Elasticsearch.ElasticsearchJsonFormatter,Serilog.Formatting.Elasticsearch"
    }
  }
]}

Раздел конфигурации MinimumLevel определяет, что должно быть по умолчанию и переопределяет определенные пространства имен.

  1. Уровень журнала по умолчанию — Информация.
  2. Классы в пространстве имен Microsoft, кроме Microsoft.Hosting.Lifetime, должны иметь минимальный уровень ведения журнала как Предупреждение.

В качестве примечания я зарегистрировал свой Serilog как

      webBuilder.UseSerilog((ctx, lc) => lc.ReadFrom.Configuration(ctx.Configuration));

И часть форматирования является тривиальной в контексте вопроса, но если вы хотите ее использовать, я сослался на Serilog.Sinks.ElasticSearch как на дополнительный пакет для ее использования.

Ваш IMyLoggerкажется чрезмерным. Предлагает MicrosoftMicrosoft.Extensions.Loggingс той же целью. Таким образом, вы можете просто ввестиILogger<MyProject.Inventory.Foo> в ваш класс, и Serilog справится с этим с помощью Serilog.Extensions.Loggingпакет. Кроме того, ваш пример должен работать как есть, оправдывая ваши ожидания. Вероятно, для ваших конкретных инъекций вы использовали неправильныйT(реализация этого не контролирует).

Просто начал поискать в Google почти то же самое: используя MinimumLevelпереопределяет несколько выделенных пространств имен или контекстов и сначала нашел этот вопрос без ответа, но следующей была эта замечательная статья.

Основы:

Первый аргумент Override - префикс исходного контекста, который обычно сопоставляется с именем типа с указанием пространства имен класса, связанного с регистратором.

// Using Serilog:
var myLog = Log.ForContext<MyClass>();
myLog.Information("Hello!");
// -> SourceContext is "MyNamespace.MyClass"
//Using Microsoft.Extensions.Logging:
var myLog = loggerFactory.CreateLogger("MyNamespace.MyClass");
myLog.LogInformation("Hello!");
// -> SourceContext is "MyNamespace.MyClass"
Другие вопросы по тегам