Serilog: вход в разные файлы

Я регистрирую события всех типов в одном файле Json независимо от LogLevel. Теперь у меня есть требование записывать некоторые настраиваемые счетчики производительности в отдельный файл Json. Как это можно сделать в Serilog. Должен ли я создать другой экземпляр регистратора и использовать его везде, где я собираюсь регистрировать счетчики производительности? Хотите использовать это с LibLog


person Shetty    schedule 20.07.2016    source источник
comment
Возможный дубликат Serilog - несколько файлов журнала   -  person Michael Freidgeim    schedule 23.09.2017


Ответы (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();
person Nicholas Blumhardt    schedule 20.07.2016
comment
Прочтите свою статью: Приключения Serilog 2.0 с дополнительными регистраторами. Не уверен, если я что-то пропустил, но если я это сделаю, журналы из MyApp.Performance также будут отправлены во внешний регистратор, верно? Я не хочу, чтобы эти конкретные журналы записывались в основной файл журнала. - person Shetty; 23.07.2016
comment
Это должно сделать добавление двух конвейеров подсистемы регистрации с обратными фильтрами. Обновление ответа .. - person Nicholas Blumhardt; 24.07.2016
comment
У меня это сработало. Отредактированный ответ для удаления JsonFormatter. - person Shetty; 24.07.2016
comment
У вас есть пример JSON? - person shiva; 12.04.2018

Мы также можем настроить его в файлах конфигурации. Ниже приведен пример 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)
            );

Дополнительные сведения см. В сообщении здесь

person Amal Dev    schedule 21.06.2020

Если вы хотите иметь независимый конвейер журналирования, просто создайте еще один экземпляр. Это ограблено и адаптировано из 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
}
person Stefan Bormann    schedule 26.03.2018