C#中使用Serilog写文件日志出现3分钟延迟问题咨询
导致Serilog日志写入延迟的常见原因
- 缓冲机制未配置:Serilog的File Sink在开启
shared: true参数时,为了兼容多进程同时写入的场景,会默认启用写入缓冲,仅当缓冲区填满或达到固定刷盘间隔时才会将日志写入磁盘。如果单条日志量小、日志产生频率低,缓冲区长期无法填满,就会出现数分钟才写入文件的情况。 - 滚动规则冲突:配置中手动拼接了带日期的文件名,同时又设置了
rollingInterval: RollingInterval.Day,两套日期滚动规则会触发Serilog内部重复的文件校验逻辑,严重时会导致文件锁排队,拉长写入耗时。 - 阈值校验开销:配置的
fileSizeLimitBytes为123456(约120KB),每次写入前Serilog都会校验当前文件大小是否超过阈值,叠加shared: true的跨进程文件锁校验,会进一步降低写入实时性。
修复方案
- 移除手动拼接的日期文件名后缀,滚动规则完全交由
rollingInterval处理,避免规则冲突:
// 无需手动拼接日期,Serilog会根据rollingInterval自动补充日期后缀 string logFileName = HostingEnvironment.MapPath(@"~/new_.log");
- 若没有多进程同时写同一份日志文件的需求,直接删除
shared: true配置,可大幅提升写入性能,关闭默认开启的缓冲机制。 - 若必须保留
shared: true配置,可显式关闭缓冲或设置较短的刷盘间隔:
Log.Logger = new LoggerConfiguration() .WriteTo.File( path: logFileName, retainedFileCountLimit: 7, shared: true, rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true, fileSizeLimitBytes: 123456, buffered: false, // 显式关闭缓冲,保证实时写入 flushToDiskInterval: TimeSpan.FromSeconds(1) // 若保留缓冲,可设置固定1秒刷盘 ) .CreateLogger();
内容的提问来源于stack exchange,提问作者Sonnich Jensen
相关产品推荐
相关产品推荐

