Serilog - 覆盖配置值
Serilog - Override config values
我正在构建一个 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}”的标记,并在运行时在文件中替换它。
我发现了以下内容,但在我的情况下无法使用环境变量:
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, and a 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
您可以在从 json 读取配置后和使用它创建记录器之前更改配置。假设以下 json:
{
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Debug"
},
"WriteTo": [
{
"Name": "Console",
"Args": {
"outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}"
}
},
{
"Name": "File",
"Args": {
"path": "placeholder",
"buffered": false,
"outputTemplate": "[{Timestamp:HH:mm:ss.fff} {Level:u3}] {Message}{NewLine}{Exception}",
"rollingInterval": "Day"
}
}
],
"Enrich": [ "FromLogContext" ]
}
}
在调用 CreateLogger 之前,使用此代码将 json 文件中的“占位符”更新为“abc.log”。
var configuration = new ConfigurationBuilder()
.AddJsonFile(AppSettingsPath,
optional: false, reloadOnChange: true)
.Build();
configuration["Serilog:WriteTo:1:Args:path"] = "abc.log";
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.WriteTo.SerilogSink(MessageBroker.Broker)
.CreateLogger();
我正在构建一个 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}”的标记,并在运行时在文件中替换它。
我发现了以下内容,但在我的情况下无法使用环境变量:
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, and a 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
您可以在从 json 读取配置后和使用它创建记录器之前更改配置。假设以下 json:
{
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Debug"
},
"WriteTo": [
{
"Name": "Console",
"Args": {
"outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}"
}
},
{
"Name": "File",
"Args": {
"path": "placeholder",
"buffered": false,
"outputTemplate": "[{Timestamp:HH:mm:ss.fff} {Level:u3}] {Message}{NewLine}{Exception}",
"rollingInterval": "Day"
}
}
],
"Enrich": [ "FromLogContext" ]
}
}
在调用 CreateLogger 之前,使用此代码将 json 文件中的“占位符”更新为“abc.log”。
var configuration = new ConfigurationBuilder()
.AddJsonFile(AppSettingsPath,
optional: false, reloadOnChange: true)
.Build();
configuration["Serilog:WriteTo:1:Args:path"] = "abc.log";
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.WriteTo.SerilogSink(MessageBroker.Broker)
.CreateLogger();