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} точно в сообщении журнала.

Я пытался использовать:

Matching.WithProperty<LogEventLevel>("Level", l => l == LogEventLevel.Warning)

но это тоже не сработало.


person Anton Kiprianov    schedule 03.02.2015    source источник
comment
@Kiquenet, это приложение WCF.   -  person Anton Kiprianov    schedule 17.02.2015
comment
Как вы регистрируете ошибки и предупреждения в своем коде с помощью Serilog?   -  person Kiquenet    schedule 17.02.2015
comment
@Kiquenet, примеры приведены ниже: Сообщение об ошибке с подробностями об исключении: Log.Logger.Error(ex, "Here goes error message with {Data}", someData) Предупреждающее сообщение: Log.Logger.Warning("Here goes warning message with {Data}", someData)   -  person Anton Kiprianov    schedule 19.02.2015


Ответы (5)



Я использую следующую конфигурацию, и она мне подходит:

            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();
person Ben Pretorius    schedule 07.10.2016
comment
Проголосовали не за вопрос, а из-за чистого решения, представленного для ведения журналов разных уровней в отдельных файлах. - person mok; 02.05.2017
comment
Как этот. Единственный вопрос, как это можно было бы перевести в конфигурационный файл JSON? Я пытался найти ссылку на синтаксис, но по какой-то причине не нашел. - person Pritorian; 12.02.2018
comment
Я не уверен, что вы можете сделать это в конфигурации json. Мой плагин VS игнорирует строку фильтра при генерации json. - person Lukos; 03.07.2018

Обычно для моих сценариев использования мне нужно несколько журналов, которые будут содержать минимальный уровень для каждого. Таким образом, позже я смогу более эффективно исследовать журналы.

Для более поздних версий Serilog я бы предложил использовать это:

Log.Logger = new LoggerConfiuration()
    .MinimumLevel.Debug()
    .WriteTo.File(path: "debug.log", rollingInterval: RollingInterval.Day)
    .WriteTo.File(path: "info.log", restrictedToMinimumLevel: LogEventLevel.Information, rollingInterval: RollingInterval.Day)
    .WriteTo.File(path: "error.log",restrictedToMinimumLevel: LogEventLevel.Error, rollingInterval: RollingInterval.Day)
    .WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Warning)
    .CreateLogger();
person Yaniv    schedule 14.06.2020

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" />
person xhafan    schedule 19.06.2019

Другой вариант - иметь ERROR и FATAL в одном файле (вместо ошибок в одном файле и фатальных в другом). Мне кажется, что многие файлы разделены. Просто помните, что можно использовать оператор "или".

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();
person nerlijma    schedule 17.09.2019