我正在构建一个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”文件夹。
问:Serilog是否支持从配置读取,然后在运行时覆盖特定参数?
我目前的解决方法是在JSON中使用一个名为“#{LogFilePath}”的令牌,并在运行时将其替换为该文件。
我发现了以下内容,但在我的情况下不能使用环境变量:Specify directory for Serilog rolling file path
According to Serilog,你需要使用文件记录 - 看起来,RollingFile很快就会消失。
重要说明:此接收器中的滚动功能已得到改进,并合并到Serilog.Sinks.File包中。 RollingFile将在可预见的将来维护,但建议将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团队和社区中被配置文件覆盖。他们创造了一个experimental repository和一个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);
如果您对我的测试应用程序的更多详细信息感兴趣,请按以下顺序执行PowerShell命令:
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