Serilog - отдельные файлы для информации, исключение с использованием appsetting.json
Я записываю все журналы в один файл (ы) с помощью прокрутки. Но я хочу разделить их наInformation
, Warning
а также Exceptions
прокатные файлы.
моя текущая конфигурация такая
"Serilog": {
"WriteTo": [
{
"Name": "RollingFile",
"Args": {
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}",
"pathFormat": "logs\\log-{Hour}.log",
"rollOnFileSizeLimit ": true,
"retainedFileCountLimit ": null,
"rollingInterval": "Hour",
"fileSizeLimitBytes": 5000000
}
}
]
},
класс
public ILogger GetLogger()
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
_logger =
new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
return _logger ;
}
2 ответа
В Serilog вы можете сделать это разделение либо через вспомогательные регистраторы, либо через Serilog.Sinks.Map.
Вы не сможете настроить весь конвейер через appsetting.json
но вы можете легко настроить путь к каждому файлу в appsetting.json
используя настраиваемый ключ по вашему выбору, и используйте его при настройке конвейера журнала с помощью кода.
Пример использования подлоггеров с примененным к каждому из них фильтром:
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();
Log.Debug("This goes to Debug.log only");
Log.Error("This goes to Error.log only");
Log.CloseAndFlush();
Пример использования Serilog.Sinks.Map сопоставления каждогоLogEventLevel
в другой файл.
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.Map(evt => evt.Level, (level, wt) => wt.File($"{level}.log"))
.CreateLogger();
Log.Debug("This goes to Debug.log only");
Log.Error("This goes to Error.log only");
Log.CloseAndFlush();
Я не тестировал, но экстраполируя документацию: вы можете попробовать создать 2 раздела в файле appconf
"ErrorLog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "RollingFile",
"Args": {
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}",
"pathFormat": "logs\\ Errorlog-{Hour}.log",
"rollingInterval": "Hour",
"restrictedToMinimumLevel": "Error"
}
}
]
},
"InfoLog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "RollingFile",
"Args": {
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{Exception}",
"pathFormat": "logs\\ Infolog-{Hour}.log",
"rollingInterval": "Hour",
"restrictedToMinimumLevel": "Information"
}
}
]
}
и вы создаете 2 регистратора:
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var errorSection = configuration.GetSection("ErrorLog");
var infoSection = configuration.GetSection("InfoLog");
_errorlog = new LoggerConfiguration()
.ReadFrom
.ConfigurationSection(errorSection)
.CreateLogger();
_infolog = new LoggerConfiguration()
.ReadFrom
.ConfigurationSection(infoSection)
.CreateLogger();