c# - Serilog - 覆盖配置值

标签 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

最佳答案

According to Serilog ,您将需要使用文件日志记录——看起来,RollingFile 可能很快就会消失。

Important note: the rolling functionality in this sink has been improved and merged into the Serilog.Sinks.File package. RollingFile will be maintained for the foreseeable future, however File is recommended for new applications.

固定格式

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

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 团队和社区似乎热衷于指定一些默认配置,然后用配置文件覆盖它。他们创造了一个 experimental repository , 和一个 Nuget Package - 不确定今天的位置。

但我认为有一个变通办法——下面是您可以如何以比“ token ”方法更简洁的方式实现它的方法之一。

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

关于c# - Serilog - 覆盖配置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55536957/

相关文章:

C# 获取注册表子项的值

c# - 如何使 WPF Slider Thumb 从任意点跟随光标

c# - 如何从azure表中获取连续的行集?

c# - 使用 SqlDataReader 和字符串数组

c# - 如何将 Visual Studio XAML 验证错误转化为构建错误?

asp.net-core - ASP.NET Core 的内置日志记录是否会使 NLog/Serilog/etc 过时?

c# - Serilog SourceContext 类名仅通过 appsettings.json 唯一方法

c# - 如何将自定义列添加到我的 Serilog MS SQL Server 接收器?

.net - 哪些文件名占位符可用于 Serilog?

c# - Serilog 结构化数据 pretty-print ?