如何在appsettings.json中编程指定年份生成Serilog日志子文件夹?
解决方案
方案1:通过代码手动配置Serilog(最可靠)
直接在Program.cs中构建Serilog配置,路径中的{Date:yyyy}会被Serilog正确解析为年份,自动创建对应子文件夹:
var builder = WebApplication.CreateBuilder(args); // 配置Serilog Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(builder.Configuration) // 读取appsettings中的基础配置 .WriteTo.Logger(lc => lc .Filter.ByIncludingOnly(evt => evt.Level is LogEventLevel.Error or LogEventLevel.Fatal) .WriteTo.File( path: "C:/data/Logs/ErrorLogs/{Date:yyyy}/errorlog_.log", rollingInterval: RollingInterval.Day, retainedFileCountLimit: null, outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}" ) ) .CreateLogger(); builder.Host.UseSerilog(); // 替换默认日志系统 var app = builder.Build(); // ... 其他中间件配置 app.Run();
对应的appsettings.json可简化,移除嵌套的Logger-File配置,只保留基础日志级别和Console输出:
"Serilog": { "MinimumLevel": { "Default": "Debug", "Override": { "Microsoft": "Information", "System": "Information" } }, "WriteTo": [ { "Name": "Console", "Args": { "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}" } } ] }
方案2:动态替换配置文件中的路径占位符
若想保留配置文件结构,可在代码中读取配置后替换自定义占位符:
- 修改appsettings.json中的path:
"path": "C:/data/Logs/ErrorLogs/{Year}/errorlog_.log"
- 在Program.cs中替换占位符:
var builder = WebApplication.CreateBuilder(args); var serilogConfig = new LoggerConfiguration().ReadFrom.Configuration(builder.Configuration); // 读取并替换路径中的年份占位符 var fileSinkSection = builder.Configuration.GetSection("Serilog:WriteTo:1:Args:configureLogger:WriteTo:0:Args"); var originalPath = fileSinkSection["path"]; var updatedPath = originalPath.Replace("{Year}", DateTime.Now.Year.ToString()); fileSinkSection["path"] = updatedPath; Log.Logger = serilogConfig.CreateLogger(); builder.Host.UseSerilog(); var app = builder.Build(); // ... 其他配置
方案3:升级Serilog相关包
如果坚持纯配置文件方式,先确保Serilog.Settings.Configuration和Serilog.Sinks.File是最新版本。旧版本可能存在路径模板解析缺陷,升级后配置文件中的{Date:yyyy}会被自动解析,无需硬编码年份。
内容的提问来源于stack exchange,提问作者L. Wallach
相关产品推荐
相关产品推荐

