You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin Forms中Serilog按大小滚动日志且仅保留单个文件的异常问题求助

解决Serilog在Xamarin Forms中每次启动都触发日志滚动的问题

你的配置缺少了几个关键参数,导致Serilog在应用启动时错误触发滚动操作,而非仅在文件达到大小限制时才执行滚动。下面是具体的问题分析和修复方案:

问题根源

  1. 默认按时间滚动:Serilog的File sink默认启用RollingInterval.Day策略,这意味着哪怕文件大小没达标,每天都会创建新日志文件。如果应用频繁启动,哪怕是同一天,旧文件的检测逻辑也可能被误触发。
  2. 文件锁定隐患:在Xamarin这类移动环境中,应用可能因异常退出、后台回收导致日志文件未正确释放,Serilog会自动创建新文件规避写入失败,同时因你设置了retainedFileCountLimit:1,旧文件会被直接删除。
  3. 未明确禁用时间滚动:没有强制指定仅按大小滚动,导致时间维度的滚动逻辑优先级覆盖了大小限制规则。

修复后的配置

修改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个日志文件,当文件达到大小限制时,旧文件会被删除,新文件随即创建,完全符合你"单文件维护"的需求。

额外注意事项

  1. 更新NuGet包:确保使用最新版本的Serilog和Serilog.Sinks.File,旧版本可能存在滚动逻辑的bug。
  2. 验证文件路径:确认LogFile指向的是应用私有存储内的固定路径,避免每次启动路径变化导致的新文件创建。
  3. 测试滚动逻辑:可以手动写入大量日志,验证是否只有当文件达到10MB时才触发滚动,而非应用启动阶段。

内容的提问来源于stack exchange,提问作者Ivaylo Penev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 10:57:29