Я хотел бы иметь журнал для информации и предупреждений, а также еще один журнал для ошибок и фатальных ошибок.
Я хотел бы использовать файл JSON, а не Fluent API, и использовать только JSON, потому что я читал, что существует проблема с получением части конфигурации из JSON и другой части из Fluent API.
Но у меня проблема, что в оба файла записаны все логи, не только информация и предупреждения в один файл и логи ошибок и фатальных ошибок в другой.
Я вижу этот вопрос, но он не использует файл json.
Мой файл program.cs такой:
builder.Services
.AddSerilog()
.AddHostedService<Worker>()
.InstalarServicios(builder.Configuration);
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(builder.Configuration)
.Enrich.FromLogContext()
.CreateLogger();
И это мой json-файл:
{
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Information",
"System": "Warning"
}
},
"WriteTo": [
{
"Name": "File",
"Args": {
"LogEventLevel": "Information, Warning",
"path": "./logs/log-informacion-.txt",
"rollingInterval": "Day"
}
},
{
"Name": "File",
"Args": {
"LogEventLevel": "Error, Fatal",
"path": "./logs/log-errores-.txt",
"rollingInterval": "Day"
}
}
]
}
}
В json-файле я пробовал использовать «RestrictedToMinimumLevel»: «Информация» для одного файла и «RestrictedToMinimumLevel»: «Error» для второго, но результат всегда один и тот же, создается два файла и в обоих пишет тот же журнал, независимо от того, информация это или ошибка.
Как я мог писать только в один файл информацию и предупреждения, а в другой логи ошибок и фатальных ошибок?
Спасибо.
Чтобы разделить журналы на два разных файла, то есть информацию и предупреждение, мы можем использовать два подхода:
Дополнительная регистрация:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.Logger(c => c.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Debug)
.WriteTo.File("Debug.log"))
.WriteTo.Logger(c => c.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Error)
.WriteTo.File("Error.log"))
.CreateLogger();
Пакет Serilog.Sinks.Map:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.Map(evt => evt.Level, (level, wt) => wt.File($"{level}.log"))
.CreateLogger();
Отредактируйте приведенный выше код в соответствии с вашими требованиями; и вы сможете реализовать это очень легко.
Кажется, вы пытаетесь отфильтровать свои журналы, а затем записать эти отфильтрованные журналы в отдельные файлы, как я вижу в вашем связанном примере.
Вы можете попробовать эти настройки конфигурации внутри файла json:
{
"Serilog": {
"Using": [ "Serilog.Sinks.File", "Serilog.Filters.Expressions" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Information",
"System": "Warning"
}
},
"WriteTo": [
{
"Name": "Logger",
"Args": {
"configureLogger": {
"Filter": [
{
"Name": "ByIncludingOnly",
"Args": {
"expression": "Level = 'Information' or Level = 'Warning'"
}
}
],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "./logs/log-informacion-.txt",
"rollingInterval": "Day"
}
}
]
}
}
},
{
"Name": "Logger",
"Args": {
"configureLogger": {
"Filter": [
{
"Name": "ByIncludingOnly",
"Args": {
"expression": "Level = 'Error' or Level = 'Fatal'"
}
}
],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "./logs/log-errores-.txt",
"rollingInterval": "Day"
}
}
]
}
}
}
]
}
}
В этой конфигурации можно увидеть отдельную фильтрацию и запись в разные файлы внутри каждого регистратора.
Спасибо за ответ. Но таким образом все равно пишутся все логи в обоих файлах, в информации тоже пишутся ошибки и в ошибках пишутся информационные логи.
@ÁlvaroGarcía Можете ли вы попробовать это? Я удалил @ внутренние выражения, которые могли бы быть невозможными для настройки @ Level внутренних выражений.
Спасибо. Оно работает. Но, возможно, вы могли бы показать полный файл .json, чтобы увидеть, что необходимо использовать «Использование»: [ «Serilog.Sinks.File», «Serilog.Filters.Expressions» ]. Но большое спасибо за решение.
@AlvaroGarcía Пожалуйста :), я только что добавил раздел «Использование», спасибо за ваш отзыв.
Спасибо за предложение. Но я бы предпочел установить конфигурацию во внешнем файле конфигурации, в данном случае в файле .json, а не в коде. Таким образом, мне не нужно заново компилировать проект, если мне нужно изменить конфигурацию.