Serilog Range уровень фильтрации - PullRequest
0 голосов
/ 08 апреля 2020

В журнале 4net у вас есть возможность объявить различные файловые приложения с уровнем levelMin levelMax. Таким образом, вы можете иметь один файл для отладки и один файл для ошибки. Как я могу иметь такое же поведение в приемнике файла serilog. У меня есть этот код, но вы можете указать только MinimumLevel

Log.Logger = new LoggerConfiguration()
            .WriteTo.Async(a =>
            {
                a.RollingFile($"{AppDomain.CurrentDomain.BaseDirectory}\\Logs\\error.txt", 
                    restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Error);
            })
            .WriteTo.Async(a =>
            {
                a.RollingFile($"{AppDomain.CurrentDomain.BaseDirectory}\\Logs\\log.txt",
                    restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Debug);
            })
            .CreateLogger();

Он создает два файла, но в log.txt я также вижу сообщения об ошибках

1 Ответ

1 голос
/ 08 апреля 2020

В Serilog вы можете использовать сублогеры с фильтром, примененным к каждому из них:

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();
...