.NET Core 6使用Serilog.Sinks.File无法生成日志,.NET Core 5正常
问题:.NET Core 6中Serilog无法生成日志文件
我在.NET Core 5中使用Serilog.Sinks.File可以正常生成日志,配置和代码如下:
.NET Core 5 配置与代码
Startup.cs 代码
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) { Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(Configuration) .CreateLogger(); loggerFactory.AddSerilog(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } }
appsettings.json 配置
"Serilog": { "MinimumLevel": "Information", "Override": { "Microsoft": "Warning" }, "Using": [ "Serilog.Sinks.File" ], "WriteTo": [ { "Name": "RollingFile", "Args": { "pathFormat": "C:\\logs\\myapi\\log-{Date}.txt" } } ] }
使用的NuGet包
<PackageReference Include="Serilog.Extensions.Logging" Version="3.1.0" /> <PackageReference Include="Serilog.Settings.Configuration" Version="3.3.0" /> <PackageReference Include="Serilog.Sinks.File" Version="5.0.0" /> <PackageReference Include="Serilog.Sinks.RollingFile" Version="3.3.0" />
迁移到.NET Core 6后,保留appsettings.json配置不变,在Program.cs中使用以下代码,但无法生成日志文件:
var logger = new LoggerConfiguration() .ReadFrom.Configuration(builder.Configuration) .Enrich.FromLogContext() .CreateLogger(); builder.Logging.ClearProviders(); builder.Logging.AddSerilog(logger);
解决方案
1. 移除废弃的Serilog.Sinks.RollingFile包
Serilog.Sinks.RollingFile已被官方废弃,Serilog.Sinks.File从v5版本开始已内置滚动文件功能,无需再引用该旧包,直接从项目中移除对应的NuGet引用即可。
2. 修改appsettings.json中的Serilog配置
将原配置中WriteTo节点的RollingFile改为File,并调整参数格式:
"Serilog": { "MinimumLevel": "Information", "Override": { "Microsoft": "Warning" }, "Using": [ "Serilog.Sinks.File" ], "WriteTo": [ { "Name": "File", "Args": { "path": "C:\\logs\\myapi\\log-.txt", "rollingInterval": "Day", "retainedFileCountLimit": 30 } } ] }
参数说明:
path: 日志文件基础路径,Serilog会自动追加日期后缀rollingInterval: 滚动周期,可选值包括Year/Month/Day/Hour/MinuteretainedFileCountLimit: 保留的日志文件最大数量,按需设置
3. 修正.NET 6 Program.cs代码
确保静态Log.Logger被正确赋值(若使用静态Log类输出日志),并添加程序退出时的Serilog清理逻辑:
var builder = WebApplication.CreateBuilder(args); // 配置Serilog Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(builder.Configuration) .Enrich.FromLogContext() .CreateLogger(); builder.Logging.ClearProviders(); builder.Logging.AddSerilog(Log.Logger); var app = builder.Build(); // 程序停止时关闭Serilog,确保日志写入完成 app.Lifetime.ApplicationStopped.Register(Log.CloseAndFlush); if (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.Run();
4. 检查日志目录权限
确认应用程序对C:\\logs\\myapi目录拥有读写权限,生产环境中需注意IIS或托管账户的权限配置。
内容的提问来源于stack exchange,提问作者Gurpreet Kailey
相关产品推荐
相关产品推荐

