Serilog - переопределить значения конфигурации - PullRequest
2 голосов
/ 05 апреля 2019

Я создаю приложение для Windows 10 (UWP) и веду журналирование с использованием Serilog.

Ниже показан файл appsettings.json, с помощью которого я настраиваю Serilog для записи в приемник Rolling File (среди других приемников)..

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.Console" ],
    "MinimumLevel": "Debug",
    "WriteTo": [
      { "Name": "Console" },
      {
        "Name": "RollingFile",
        "Args": {
          "pathFormat": "#{LogFilePath}log-{Date}.txt",
          "fileSizeLimitBytes": "3000",
          "retainedFileCountLimit": "2"
        }
      }      
    ],
    "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
    "Properties": {
      "Application": "Sample"
    }
  }
}

Затем я вызываю следующий код:

 var configuration = new ConfigurationBuilder()                        
        .AddJsonFile(sampleFile.Path)
        .Build();

    Log.Logger = new LoggerConfiguration()
        .ReadFrom.Configuration(configuration)
        .CreateLogger();

Однако мне нужно иметь возможность изменять атрибут pathFormat во время выполнения, чтобы журнал записывался в приложение.Папка «LocalState».

Q.Поддерживает ли Serilog чтение из конфигурации, а затем переопределяет, в частности, аргументы во время выполнения?

Мой текущий обходной путь - использовать в JSON токен с именем «# {LogFilePath}» и заменить его в файле во время выполнения.

Я обнаружил следующее, но не могу использовать переменные окружения в моем случае: Укажите каталог для пути к файлу Serilog для прокатки

1 Ответ

1 голос
/ 07 апреля 2019

Согласно Serilog , вам нужно будет использовать ведение журнала файлов - похоже, что RollingFile может скоро уйти.

Важное примечание: функция прокрутки в этой раковине была улучшено и объединено в пакет Serilog.Sinks.File. RollingFile будет сохраняться в обозримом будущем, однако файл рекомендуется для новых применений.

Фиксированный формат

Вот простой способ использования File Sink:

appsettings.json

{
  "Serilog": {
    "MinimumLevel": "Verbose",
    "WriteTo": [
      {
        "Name": "Console"        
      },
      {
        "Name": "File",
        "Args": {
          "path": "Logs\\log.txt",
          "fileSizeLimitBytes": 3000,
          "buffered": false,
          "rollOnFileSizeLimit": true,
          "retainedFileCountLimit": 3,
          "rollingInterval": "Hour"
        }
      }
    ]
  }
}

Program.cs

var configuration = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true).Build();
var loggerConfig = new LoggerConfiguration().ReadFrom.Configuration(configuration);
var logger = loggerConfig.CreateLogger();

Пользовательский формат

В прошлом году, казалось, был некоторый энтузиазм, чтобы указать некоторую конфигурацию по умолчанию, а затем переопределить ее в файлах конфигурации, в команде Serilog и сообществе. Они создали экспериментальный репозиторий и Nuget Package - не уверен, где он стоит сегодня.

Но я думаю, что есть обходной путь - ниже приведен один из способов, как вы могли бы реализовать это немного чище, чем ваш "токеновый" подход.

appsettings.json

{
  "FileLogger": {
    //"path": "Logs\\log.txt",
  }
}

Таким образом, если вы укажете значение в файле конфигурации, оно будет иметь приоритет. Иначе, ваш собственный формат будет использоваться. На мой взгляд, наличие значений по умолчанию, указанных в приложении, и последующее использование конфигураций для их переопределения (а не наоборот) - лучший дизайн.

Program.cs

var configuration = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true).Build();

var customLogFileFormat = configuration["FileLogger:path"] ?? $"Logs\\log_{DateTime.Now.ToString("MMddyyyy_hhmmsstt")}log.txt";

var loggerConfig = new LoggerConfiguration()
                .MinimumLevel.Debug()
                .WriteTo.Console()
                .WriteTo.File(
                    path: customLogFileFormat,
                    fileSizeLimitBytes: 3000,
                    buffered: true,
                    rollOnFileSizeLimit: true,
                    rollingInterval: RollingInterval.Day,
                    retainedFileCountLimit: 5);

Если вас интересует более подробная информация о моем тестовом приложении, может помочь следующая последовательность команд PoweShell:

mkdir SerilogApp
cd SerilogApp
dotnet new console -f netcoreapp2.2 -n SerilogApp -o SerilogApp
dotnet new sln -n SerilogApp.sln
dotnet sln add .\SerilogApp\SerilogApp.csproj
dotnet add .\SerilogApp\SerilogApp.csproj package Microsoft.Extensions.Configuration -f netcoreapp2.2
dotnet add .\SerilogApp\SerilogApp.csproj package Microsoft.Extensions.Configuration.FileExtensions -f netcoreapp2.2
dotnet add .\SerilogApp\SerilogApp.csproj package Microsoft.Extensions.Configuration.Json -f netcoreapp2.2
dotnet add .\SerilogApp\SerilogApp.csproj package Serilog -f netcoreapp2.2
dotnet add .\SerilogApp\SerilogApp.csproj package Serilog.Settings.Configuration -f netcoreapp2.2
dotnet add .\SerilogApp\SerilogApp.csproj package Serilog.Sinks.Console -f netcoreapp2.2
 dotnet add .\SerilogApp\SerilogApp.csproj package Serilog.Sinks.File -f netcoreapp2.2 -v 4.0.0
cd .\SerilogApp
echo $null >> appsettings.json
...