ASP.NET Core 3.1多IIS实例Serilog共享日志配置及延迟写入问题
解决ASP.NET Core 3.1中Serilog的两个配置问题
针对你遇到的两个Serilog问题,以下是具体的解决方案和修改后的配置:
问题1:日志仅在首次请求后写入文件
原因
当前Serilog初始化时机较晚,主机启动阶段的日志未被捕获,且File Sink默认延迟创建文件,直到第一个日志事件触发。
解决方法
在Main方法中提前初始化Serilog,捕获启动日志并强制触发文件创建:
修改后的Program.cs:
public class Program { public static void Main(string[] args) { // 提前初始化Serilog,确保启动日志被捕获 Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory); Directory.CreateDirectory("Logs"); var configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.Serilog.json", optional: false, reloadOnChange: true) .Build(); Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration) .Enrich.FromLogContext() .CreateLogger(); try { Log.Information("Web主机启动中"); CreateHostBuilder(args).Build().Run(); } catch (Exception ex) { Log.Fatal(ex, "Web主机意外终止"); } finally { Log.CloseAndFlush(); } } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseSerilog() // 直接使用已初始化的Serilog实例 .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); }
问题2:多IIS实例无冲突写入共享日志文件
关键配置要点
- 使用绝对共享路径:替换相对路径为UNC共享路径(或本地绝对路径),确保所有实例指向同一文件
- 确认
shared: true生效:该参数启用多进程共享写入模式 - 可选:添加刷新间隔:确保日志及时写入磁盘,避免内存积压
修改后的appsettings.Serilog.json:
{ "Serilog": { "MinimumLevel": { "Default": "Information", "Override": { "Microsoft": "Warning", "System": "Warning" } }, "Using": [ "Serilog.Sinks.File" ], "WriteTo": [ { "Name": "File", "Args": { "Path": "\\\\共享服务器地址\\SharedLogs\\log-{Date}.log", // JSON需转义反斜杠,替换为实际共享路径 "shared": true, "RollingInterval": "Day", "RetainedFileCountLimit": null, "flushToDiskInterval": 1, // 每秒刷新一次到磁盘,可选 "formatter": { "type": "Serilog.Templates.ExpressionTemplate, Serilog.Expressions", "template": "[{@t:yyyy-MM-dd HH:mm:ss} {@l:u3}] {@m}\n{@x}" } } } ] } }
额外注意事项
- 确保所有IIS应用池的运行身份拥有共享文件夹的读写权限
- 升级
Serilog.Sinks.File包到v4.0及以上版本,确保共享模式稳定支持 - 滚动日志命名中加入
{Date},避免单文件过大,同时多实例写入时自动处理文件切换逻辑
内容的提问来源于stack exchange,提问作者Cdke2ko
相关产品推荐
相关产品推荐

