Я регистрирую события всех типов в одном файле Json независимо от LogLevel. Теперь у меня есть требование записывать некоторые настраиваемые счетчики производительности в отдельный файл Json. Как это можно сделать в Serilog. Должен ли я создать другой экземпляр регистратора и использовать его везде, где я собираюсь регистрировать счетчики производительности? Хотите использовать это с LibLog
Serilog: вход в разные файлы
Ответы (3)
Вы можете сделать это, сначала убедившись, что события счетчика производительности помечены либо определенным значением свойства (OpenMappedContext()
в LibLog), либо определенным типом / пространством имен.
var log = LogProvider.For<MyApp.Performance.SomeCounter>()
log.Info(...);
При настройке Serilog sub-logger с примененным фильтром может отправьте во второй файл только необходимые события.
Log.Logger = new LoggerConfiguration()
.WriteTo.Logger(lc => lc
.Filter.ByExcluding(Matching.FromSource("MyApp.Performance"))
.WriteTo.File("first.json", new JsonFormatter()))
.WriteTo.Logger(lc => lc
.Filter.ByIncludingOnly(Matching.FromSource("MyApp.Performance"))
.WriteTo.File("second.json", new JsonFormatter()))
.CreateLogger();
Мы также можем настроить его в файлах конфигурации. Ниже приведен пример appsettings.json
для разделения журнала на скользящие файлы по уровням.
{
"Serilog": {
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"WriteTo": [
{
"Name": "Logger",
"Args": {
"configureLogger": {
"Filter": [
{
"Name": "ByIncludingOnly",
"Args": {
"expression": "(@Level = 'Error' or @Level = 'Fatal' or @Level = 'Warning')"
}
}
],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs/ex_.log",
"outputTemplate": "{Timestamp:o} [{Level:u3}] ({SourceContext}) {Message}{NewLine}{Exception}",
"rollingInterval": "Day",
"retainedFileCountLimit": 7
}
}
]
}
}
},
{
"Name": "Logger",
"Args": {
"configureLogger": {
"Filter": [
{
"Name": "ByIncludingOnly",
"Args": {
"expression": "(@Level = 'Information' or @Level = 'Debug')"
}
}
],
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs/cp_.log",
"outputTemplate": "{Timestamp:o} [{Level:u3}] ({SourceContext}) {Message}{NewLine}{Exception}",
"rollingInterval": "Day",
"retainedFileCountLimit": 7
}
}
]
}
}
}
],
"Enrich": [
"FromLogContext",
"WithMachineName"
],
"Properties": {
"Application": "MultipleLogFilesSample"
}
}
}
Затем вам нужно будет только изменить метод CreateHostBuilder
в Program.cs
файле, чтобы прочитать его из файла конфигурации.
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseSerilog((hostingContext, loggerConfig) =>
loggerConfig.ReadFrom.Configuration(hostingContext.Configuration)
);
Дополнительные сведения см. В сообщении здесь
Если вы хотите иметь независимый конвейер журналирования, просто создайте еще один экземпляр. Это ограблено и адаптировано из https://github.com/serilog/serilog/wiki/Lifecycle-of-Loggers:
using (var performanceCounters = new LoggerConfiguration()
.WriteTo.File(@"myapp\log.txt")
.CreateLogger())
{
performanceCounters.Information("Performance is really good today ;-)");
// Your app runs, then disposal of `performanceCounters` flushes any buffers
}