ASP.NET Core 8 Web API部署IIS后Serilog无法写入日志
问题背景
开发ASP.NET Core 8 Web API项目,使用Serilog同时向控制台和文件输出日志,本地Visual Studio运行时日志正常生成,但发布到IIS后,指定路径C:\NotificationSystemLogs下无日志文件生成,应用可正常访问,但Serilog静默不写入文件。
现有配置
appsettings.json中的Serilog配置
"Serilog": { "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ], "MinimumLevel": { "Default": "Information", "Override": { "Microsoft": "Warning", "System": "Warning" } }, "WriteTo": [ { "Name": "Console" }, { "Name": "File", "Args": { "path": "C:\\NotificationSystemLogs\\log-.txt", "rollingInterval": "Day", "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}" } } ], "Enrich": [ "FromLogContext" ], "Properties": { "Application": "NotificationSystem" } }
Program.cs中的代码
Log.Logger = new LoggerConfiguration() .WriteTo.Console() .CreateBootstrapLogger(); Log.Information("Starting up..."); builder.Host.UseSerilog((ctx, services, configuration) => new LoggerConfiguration() .ReadFrom.Configuration(ctx.Configuration) .ReadFrom.Services(services) .Enrich.FromLogContext() .CreateLogger() );
已尝试的排查步骤
- 手动创建
C:\NotificationSystemLogs文件夹并赋予Everyone完全权限 - 为IIS应用池标识
APPPOOL\NotificationSystem授予文件夹修改权限 - 确认appsettings.json中路径使用双反斜杠格式正确
- 尝试从后台服务和中间件写入日志,无输出
- 启用
SelfLog.Enable(...)调试Serilog,未捕获到错误
环境信息
- ASP.NET Core 8 Web API
- 托管于IIS(Windows Server)
- 应用池标识:ApplicationPoolIdentity
- 日志文件夹路径:
C:\NotificationSystemLogs
排查思路
结合现有排查结果,可从以下方向进一步定位问题:
BootstrapLogger与正式Logger的配置冲突
当前BootstrapLogger仅配置了控制台输出,后续通过UseSerilog加载配置时可能存在初始化顺序问题。可调整代码,让Bootstrap阶段也读取配置文件,确保启动日志能写入文件:var builder = WebApplication.CreateBuilder(args); Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(builder.Configuration) .CreateBootstrapLogger(); Log.Information("Starting up..."); builder.Host.UseSerilog((ctx, services, config) => config .ReadFrom.Configuration(ctx.Configuration) .ReadFrom.Services(services) .Enrich.FromLogContext());IIS进程的实际权限限制
即使配置了应用池权限,Windows Server的UAC或文件夹继承权限可能未生效。可尝试:- 将日志路径改为网站根目录下的相对路径(如
.\Logs\log-.txt),避开系统盘根目录的严格权限限制 - 临时将应用池标识改为
LocalSystem(仅测试用),验证是否为权限问题
- 将日志路径改为网站根目录下的相对路径(如
生产环境配置覆盖问题
检查发布到IIS后的appsettings.Production.json是否覆盖了Serilog的File配置,比如移除了File Sink或修改了路径,确保生产环境配置中包含完整的File写入节点。路径解析问题
尝试在配置中使用正斜杠路径(C:/NotificationSystemLogs/log-.txt),避免双反斜杠可能的解析异常;或使用环境变量动态指定路径,增强兼容性。组件版本兼容性
确认Serilog.Sinks.File、Serilog.AspNetCore等依赖包的版本与ASP.NET Core 8兼容,更新到最新稳定版本后重新部署测试。IIS stdout日志排查
启用IIS的stdout日志,查看是否有Serilog初始化相关的错误输出。在web.config中添加:<aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />查看生成的stdout日志,定位是否存在未捕获的初始化异常。
内容的提问来源于stack exchange,提问作者Hady Salah

