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
相关产品推荐
相关产品推荐

