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

ASP.NET Core Web API在IIS中使用Serilog共享日志文件失败问题排查

IIS托管多API共享Serilog日志文件失败的原因及解决办法

可能的原因和对应解决步骤

1. JSON配置里的布尔值格式错误

你的Serilog配置中,rollOnFileSizeLimit和shared都写成了带引号的"true",但这类参数属于布尔类型,不需要加引号。本地调试和Windows服务场景可能能兼容错误解析,但IIS托管下的配置绑定更严格,会导致shared参数未真正生效,文件被独占锁定。

修正配置中的布尔值(去掉引号):

{
  "Serilog": {
    "Using": [
      "Serilog.Sinks.File"
    ],
    "MinimumLevel": {
      "Default": "Verbose",
      "Override": {
        "Microsoft.AspNetCore.Hosting": "Warning",
        "Microsoft.AspNetCore.Routing": "Warning"
      }
    },
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "D:/Logs/Log-.txt",
          "restrictedToMinimumLevel": "Information",
          "rollingInterval": "Day",
          "rollOnFileSizeLimit": true,
          "fileSizeLimitBytes": 1000000,
          "retainedFileCountLimit": 90,
          "shared": true,
          "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level:u3}] [{App}{ThreadId}] {SourceContext} [{Caller}] {Message:lj}{NewLine}{Exception}"
        }
      }
    ],
    "Enrich": [ "FromLogContext", "WithThreadId" ]
  }
}

修改完成后重启所有API对应的应用池测试。

2. IIS应用池身份权限不统一

每个API的应用池默认使用独立的虚拟账户(ApplicationPoolIdentity),虽然都能写入独立日志文件,但共享文件时可能因权限继承的细微差异,导致无法获取共享访问权限。

尝试将三个API的应用池身份统一为同一个账户:

  • 打开IIS管理器,找到每个API对应的应用池
  • 右键点击应用池→高级设置→进程模型→标识,选择同一个内置账户(比如LocalSystem),或指定一个对D:/Logs文件夹拥有完全控制权限的本地/域账户
  • 修改完成后重启应用池

3. Serilog.Sinks.File版本过旧

旧版本的Serilog文件接收器在多进程(尤其是IIS的w3wp进程)场景下,可能存在共享文件的兼容性bug。直接升级Serilog.Sinks.File到最新稳定版本即可,可通过NuGet包管理器或命令行操作:

Update-Package Serilog.Sinks.File

4. IIS应用池进程隔离设置问题

IIS应用池默认的进程隔离或快速失败保护机制,可能导致单个进程独占日志文件。可以尝试以下操作:

  • 暂时禁用应用池的“快速失败保护”(高级设置→进程模型→快速失败保护),测试是否恢复正常
  • 确保所有应用池的“加载用户配置文件”设为True(高级设置→进程模型→加载用户配置文件),避免文件访问时的上下文缺失

内容的提问来源于stack exchange,提问作者Jai dewani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 20:05:21