You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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:动态替换配置文件中的路径占位符

若想保留配置文件结构,可在代码中读取配置后替换自定义占位符:

  1. 修改appsettings.json中的path:
"path": "C:/data/Logs/ErrorLogs/{Year}/errorlog_.log"
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 18:50:04