ASP.NET Kestrel应用IIS部署无限启停循环,如何排查日志?
老兄,这种无日志的循环重启确实让人头大——我之前排查过几乎一模一样的问题,给你几个能把隐藏日志挖出来的实操方法,一步步来:
1. 强制开启ASP.NET Core的标准输出日志
这是最直接的突破口,因为IIS托管时默认不会记录应用的启动日志,你需要修改站点根目录的web.config,把stdout日志打开:
<aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />
- 注意要先在站点根目录创建
logs文件夹,否则日志会因为权限问题写不进去 - 重启应用池后,让循环重启几次,去
logs目录里看生成的stdout_xxxxxx.log文件,里面会有应用启动时的详细输出,哪怕是没抛出到IIS的内部异常也能找到
2. 启用IIS的失败请求跟踪(FREB)
这个工具能跟踪请求从进入IIS到返回的全流程,哪怕应用没抛出明确错误,也能定位到哪里出了问题:
- 打开IIS管理器,选中你的目标站点,右侧操作面板点击「失败请求跟踪规则」
- 点击「添加」,按照向导配置:
- 第一步选「所有内容」(因为你的情况没有明确状态码,可能是启动阶段就挂了)
- 第二步勾选「时间限制」,比如设为30秒(超过这个时间的请求都会被跟踪)
- 第三步确保勾选了「ASP.NET Core」模块,其他必要模块也一并选中
- 启用后触发重启循环,然后去
%SystemDrive%\inetpub\logs\FailedReqLogFiles目录找生成的日志文件,用IE或者专门的日志查看器打开,能看到每个模块的执行时间、返回状态,甚至应用启动时的异常细节
3. 深挖Windows事件查看器的隐藏日志
服务器日志没记录不代表系统日志没有,重点排查这几个区域:
- 「Windows日志 > 应用程序」:找来源为
ASP.NET Core或者dotnet的事件,里面可能有应用启动失败的内部错误,比如依赖缺失、配置文件加载失败 - 「应用程序和服务日志 > Microsoft > Windows > IIS-APPPOOL」:这里会记录应用池的回收、崩溃、重启原因,比如是不是因为内存超限、进程意外终止被IIS强制重启
- 「应用程序和服务日志 > .NET Runtime」:如果应用启动时出现未处理的CLR异常,这里会有详细的堆栈信息
4. 调整应用池的快速失败保护设置
有时候IIS的快速失败保护会因为几次启动失败就不断重启应用池,你可以临时调整来稳住应用,方便排查:
- 打开IIS管理器,找到对应应用池,右键「高级设置」
- 找到「快速失败保护」选项:
- 把「失败次数」调大(比如从5改成20),或者暂时把「启用快速失败保护」设为False
- 同时把「关闭时间限制」调长一点,给应用足够的启动时间
- 重启应用池后,看看能不能让应用稳定下来,同时结合前面的日志工具记录情况
5. 对比反向代理模式的配置差异
既然独立模式+IIS反向代理正常,那对比两种模式的web.config和环境变量:
- 直接托管时的
web.config用的是hostingModel="InProcess",反向代理时应该是OutOfProcess,可以尝试切换托管模式,看问题是否消失 - 检查两种模式下的环境变量(比如应用池的「环境变量」设置),有没有差异,比如
ASPNETCORE_ENVIRONMENT是不是不一样,导致加载了不同的配置
按照这些方法走,大概率能找到隐藏的问题根源——我之前就是通过stdout日志发现应用启动时加载了一个损坏的配置文件,而这个异常没被IIS捕获到,才导致了无限重启。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

