Xamarin Forms中Serilog按大小滚动日志且仅保留单个文件的异常问题求助
解决Serilog在Xamarin Forms中每次启动都触发日志滚动的问题
你的配置缺少了几个关键参数,导致Serilog在应用启动时错误触发滚动操作,而非仅在文件达到大小限制时才执行滚动。下面是具体的问题分析和修复方案:
问题根源
- 默认按时间滚动:Serilog的
Filesink默认启用RollingInterval.Day策略,这意味着哪怕文件大小没达标,每天都会创建新日志文件。如果应用频繁启动,哪怕是同一天,旧文件的检测逻辑也可能被误触发。 - 文件锁定隐患:在Xamarin这类移动环境中,应用可能因异常退出、后台回收导致日志文件未正确释放,Serilog会自动创建新文件规避写入失败,同时因你设置了
retainedFileCountLimit:1,旧文件会被直接删除。 - 未明确禁用时间滚动:没有强制指定仅按大小滚动,导致时间维度的滚动逻辑优先级覆盖了大小限制规则。
修复后的配置
修改Logger配置,补充关键参数:
Log.Logger = new LoggerConfiguration() .WriteTo.File( path: LogFile, rollOnFileSizeLimit: true, retainedFileCountLimit: 1, fileSizeLimitBytes: 10485760, // 10MB rollingInterval: RollingInterval.Infinite, // 禁用按时间滚动,仅遵循大小限制 shared: true) // 允许共享文件访问,避免锁定导致的不必要新文件创建 .CreateLogger();
参数详解
rollingInterval: RollingInterval.Infinite:这是解决启动误滚动的核心,强制Serilog完全忽略时间维度的滚动逻辑,仅在文件达到设定大小限制时才触发滚动。shared: true:适配移动设备的文件访问场景,避免因应用异常退出导致的文件锁定问题,防止Serilog因无法写入旧文件而强制创建新文件。retainedFileCountLimit: 1:确保同一时刻仅保留1个日志文件,当文件达到大小限制时,旧文件会被删除,新文件随即创建,完全符合你"单文件维护"的需求。
额外注意事项
- 更新NuGet包:确保使用最新版本的
Serilog和Serilog.Sinks.File,旧版本可能存在滚动逻辑的bug。 - 验证文件路径:确认
LogFile指向的是应用私有存储内的固定路径,避免每次启动路径变化导致的新文件创建。 - 测试滚动逻辑:可以手动写入大量日志,验证是否只有当文件达到10MB时才触发滚动,而非应用启动阶段。
内容的提问来源于stack exchange,提问作者Ivaylo Penev
相关产品推荐
相关产品推荐

