Serilog多文件日志配置中fileSizeLimitBytes不生效求助
问题:Serilog多文件日志的fileSizeLimitBytes不生效,文件未满设定大小就滚动
我已基于Serilog实现多文件日志输出,当前配置向API日志文件写入日志,同时通过Filter.ByIncludingOnly将指定类(Web.Core.Helpers.ExcelReader)的日志单独输出到另一文件。过滤功能正常,但fileSizeLimitBytes属性未生效——日志文件仅达到98KB就滚动生成新文件。请问有其他实现按指定大小滚动日志的方法吗?
当前配置代码:
Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration) .WriteTo.Logger(lc => lc .Filter.ByIncludingOnly(evt => evt.Properties.ContainsKey("SourceContext") && evt.Properties["SourceContext"].ToString().Contains("Web.Core.Helpers.ExcelReader")) .WriteTo.Map("Name", "import", (name, wt) => wt.File($"./Logs/log-{name}-.txt", rollingInterval: RollingInterval.Day, fileSizeLimitBytes: 200000, // File size limit for the 'import' key rollOnFileSizeLimit: true, retainedFileCountLimit: 60))) .WriteTo.Logger(lc => lc .WriteTo.Map("Name", "api", (name, wt) => wt.File($"./Logs/log-{name}-.txt", rollingInterval: RollingInterval.Day, fileSizeLimitBytes: 100000, rollOnFileSizeLimit: true, retainedFileCountLimit: 60))) .CreateLogger();
日志文件滚动情况:
解决方法
1. 排查配置冲突
你使用了.ReadFrom.Configuration(configuration)加载外部配置,如果appsettings.json等配置文件中也定义了文件滚动规则,会与代码中的设置冲突,且外部配置优先级更高。可以先注释掉.ReadFrom.Configuration(configuration)进行测试,确认是否是配置冲突导致的问题。
2. 单独按大小滚动(关闭按天规则)
如果不需要同时按天和大小滚动,可将rollingInterval设为RollingInterval.Infinite,仅按文件大小触发滚动:
.WriteTo.Map("Name", "import", (name, wt) => wt.File($"./Logs/log-{name}-.txt", rollingInterval: RollingInterval.Infinite, fileSizeLimitBytes: 200000, rollOnFileSizeLimit: true, retainedFileCountLimit: 60))
3. 升级Serilog.Sinks.File包
旧版本的Serilog.Sinks.File可能存在fileSizeLimitBytes与RollingInterval.Day组合使用时的bug,建议升级到最新版本的NuGet包,再测试滚动逻辑是否正常。
4. 自定义滚动逻辑(进阶)
若以上方法无效,可自定义文件名格式和滚动逻辑,确保大小滚动的判断准确:
.WriteTo.Logger(lc => lc .Filter.ByIncludingOnly(evt => evt.Properties.ContainsKey("SourceContext") && evt.Properties["SourceContext"].ToString().Contains("Web.Core.Helpers.ExcelReader")) .WriteTo.File( path: "./Logs/log-import-.txt", rollingInterval: RollingInterval.Day, fileSizeLimitBytes: 200000, rollOnFileSizeLimit: true, retainedFileCountLimit: 60, outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}" ) )
内容的提问来源于stack exchange,提问作者chatay
相关产品推荐
相关产品推荐

