Serilog-覆盖配置值

时间:2019-04-05 13:53:19

标签: c# serilog

我正在构建Windows 10应用(UWP),并使用Serilog实施日志记录。

下面显示的是一个appsettings.json文件,通过它我将Serilog配置为写入滚动文件接收器(以及其他接收器)。

{
  "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”文件夹。

问: Serilog是否支持从配置读取,然后在运行时覆盖特别的参数?

我当前的解决方法是在JSON中使用一个名为“#{LogFilePath}”的令牌,并在运行时将其替换到文件中。

我找到了以下内容,但在我的情况下无法使用环境变量:Specify directory for Serilog rolling file path

1 个答案:

答案 0 :(得分:0)

Minimal, Complete and Verifiable Example,您将需要使用文件记录功能-看起来RollingFile可能很快就会消失。

  

重要说明:此接收器中的滚动功能已   改进并合并到Serilog.Sinks.File包中。滚动文件   将在可预见的将来维护,但是File是   推荐用于新应用。

固定格式

这是使用文件接收器的直接方法:

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团队和社区中,似乎有些热情地指定了一些默认配置,然后被配置文件覆盖了。他们创建了一个According to Serilog和一个experimental repository-不确定今天的地位。

但是我认为有一个解决方法-与“令牌”方法相比,下面是一种可以以一种更简洁的方式实现此目标的方法。

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