Serilog - несколько файлов журнала
Я использую Serilog для регистрации и не могу определить, как разделить события журнала на разные файлы. Например, я хочу регистрировать ошибки error_log-ddmmyyyy.txt и предупреждения для warn_log-ddmmyyyy.txt.
Здесь моя конфигурация журнала:
Log.Logger = new LoggerConfiguration()
.WriteTo.Logger(lc =>
lc.Filter.ByIncludingOnly(Matching.WithProperty("Level", "Warning"))
.WriteTo.RollingFile(
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Logs\warn_log-{Date}.txt"),
outputTemplate: OutputTemplate))
.WriteTo.Logger(lc =>
lc.Filter.ByIncludingOnly(Matching.WithProperty("Level", "Error"))
.WriteTo.RollingFile(
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Logs\error_log-{Date}.txt"),
outputTemplate: OutputTemplate))
.CreateLogger();
Он работает только тогда, когда я определяю свойство {Level} exatcly в сообщении журнала.
Я пытался использовать:
Matching.WithProperty<LogEventLevel>("Level", l => l == LogEventLevel.Warning)
но это тоже не сработало.
Ответы
Ответ 1
Я думаю, что вам нужно:
.ByIncludingOnly(evt => evt.Level == LogEventLevel.Warning)
Редактировать:
Во многих случаях сейчас более лаконично использовать Serilog.Sinks.Map. При этом пример можно записать так:
Log.Logger = new LoggerConfiuration()
.WriteTo.Map(
evt => evt.Level,
(level, wt) => wt.RollingFile("Logs\\" + level + "-{Date}.log"))
.CreateLogger();
Ответ 2
Я использую следующую конфигурацию, и она работает для меня:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.LiterateConsole()
.WriteTo.Logger(l => l.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Information).WriteTo.RollingFile(@"Logs\Info-{Date}.log"))
.WriteTo.Logger(l => l.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Debug ).WriteTo.RollingFile(@"Logs\Debug-{Date}.log"))
.WriteTo.Logger(l => l.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Warning ).WriteTo.RollingFile(@"Logs\Warning-{Date}.log"))
.WriteTo.Logger(l => l.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Error ).WriteTo.RollingFile(@"Logs\Error-{Date}.log"))
.WriteTo.Logger(l => l.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Fatal ).WriteTo.RollingFile(@"Logs\Fatal-{Date}.log"))
.WriteTo.RollingFile(@"Logs\Verbose-{Date}.log")
.CreateLogger();
Ответ 3
var dateTimeNowString = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}";
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.WriteTo.Logger(
x => x.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Error)
.WriteTo.File($"Logs/{dateTimeNowString}-Error.log")
)
.WriteTo.Logger(
x => x.Filter.ByIncludingOnly(e => e.Level == LogEventLevel.Warning)
.WriteTo.File($"Logs/{dateTimeNowString}-Warning.log")
)
.WriteTo.File($"Logs/{dateTimeNowString}-All.log")
.WriteTo.Console()
.CreateLogger();
Это мои пакеты nuget:
<PackageReference Include="Serilog.AspNetCore" Version="2.1.1" />
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
<PackageReference Include="Serilog.Sinks.File" Version="4.0.0" />
Ответ 4
Другой вариант - иметь ОШИБКИ и ФАТАЛЬНЫЕ в одном файле (вместо ошибок в одном файле и фатальных в другом). Кажется, многие файлы для меня их раздельные. Просто помните, что можно использовать оператор "или".
Log.Logger = new LoggerConfiguration()
.WriteTo.File("logs\\all.log", rollingInterval: RollingInterval.Day)
.WriteTo.Logger(
x => x.Filter.ByIncludingOnly(y => y.Level == Serilog.Events.LogEventLevel.Error || y.Level == Serilog.Events.LogEventLevel.Fatal)
.WriteTo.File("logs\\error.log", rollingInterval: RollingInterval.Day))
.CreateLogger();