Как настроить 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 определяет, что должно быть по умолчанию и переопределяет определенные пространства имен.
- Уровень журнала по умолчанию — Информация.
- Классы в пространстве имен 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"