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

NLog配置文件导致HTTP Error 500.30 - ANCM进程内启动失败

解决ASP.NET Core中NLog数据库日志导致的ANCM In-Process Start Failure错误

嘿,你遇到的这个问题我之前也帮不少开发者排查过——配置NLog数据库日志后应用直接启动失败,移除nlog.config就正常,这大概率是NLog配置本身、数据库连接或者依赖相关的问题。下面给你一步步拆解排查思路,帮你快速定位解决:

1. 优先查看NLog内部日志,精准定位错误

你的配置里已经开启了internalLogFile="c:\temp\internal-nlog.txt",这是最关键的排查入口!赶紧去C:\temp目录下找这个日志文件,里面会清清楚楚记录NLog初始化时的具体错误——比如数据库连接字符串读不出来、目标数据库表不存在、应用权限不够、依赖包缺失等等。这比瞎猜效率高多了,一定要先看这个!

2. 排查数据库连接字符串的读取问题

你用${appsettings:name=ConnectionStrings.DefaultConnection}从配置文件读取连接字符串,这里要确认几个点:

  • 你的appsettings.json(或者对应环境的配置文件,比如appsettings.Production.json)里确实存在ConnectionStrings.DefaultConnection这个配置项,拼写完全一致(注意!配置键是大小写敏感的)
  • 如果是在非开发环境运行,要确认配置文件有没有被正确加载,比如会不会被环境变量覆盖了这个配置
  • 可以先做个测试:把连接字符串硬编码到nlog.config的connectionString里,比如改成"Server=你的数据库服务器;Database=你的库名;User Id=账号;Password=密码;",如果这样能正常启动,说明就是配置读取的问题

3. 检查数据库表结构是否完全匹配

你的commandText里要插入dbo.WebLog表,得确保这个表已经存在,并且字段和插入参数完全对应:

  • 字段名:Application、Logged、Level、Message、Logger、CallSite、Exception,拼写和大小写要一致(虽然SQL Server不严格区分,但统一写法能避免奇怪问题)
  • 字段类型:比如Logged得是datetime/datetime2类型,Exception要设为nvarchar(max)(不然存不下长异常信息),Level设为nvarchar(50)就够了
  • 如果表还没创建,直接用下面的SQL脚本生成:
CREATE TABLE dbo.WebLog (
    Id INT IDENTITY(1,1) PRIMARY KEY,
    Application NVARCHAR(50) NOT NULL,
    Logged DATETIME2 NOT NULL,
    Level NVARCHAR(50) NOT NULL,
    Message NVARCHAR(MAX) NOT NULL,
    Logger NVARCHAR(250),
    CallSite NVARCHAR(MAX),
    Exception NVARCHAR(MAX)
);

4. 确认NLog相关依赖包是否正确安装

要保证你的项目里装了必要的NuGet包:

  • NLog.Web.AspNetCore:你已经在配置里引用了,但要注意版本和你的ASP.NET Core版本匹配(比如.NET 6对应NLog.Web.AspNetCore 5.x+,.NET 7/8对应6.x+)
  • NLog.Database:这个是数据库目标必需的包,别漏装了
    可以打开NuGet包管理器,检查这些包的状态,版本不兼容也会导致启动失败

5. 检查应用进程的数据库访问权限

如果你的应用是在IIS下运行,应用池的身份(比如默认的ApplicationPoolIdentity)需要有访问目标数据库的权限——包括连接数据库和插入数据的权限。可以先测试用连接字符串里的SQL账号能不能正常插入数据,如果可以,再排查IIS应用池的权限配置

6. 修复NLog配置里的小细节

你的配置里有个小问题:commandText里的参数是@Application(大写A),但下面的参数定义里写的是@application(小写a)。虽然SQL Server不区分大小写,但最好统一写法,避免潜在的匹配问题。另外,callsite参数的拼写也要和表字段CallSite保持一致

最后一招:简化配置逐步测试

如果上面的排查都没找到问题,那就先简化nlog.config,先让NLog能正常工作,再逐步添加数据库目标:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      throwConfigExceptions="true"
      internalLogLevel="info"
      internalLogFile="c:\temp\internal-nlog.txt">

  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>

  <targets>
    <!-- 先加一个简单的文件目标测试NLog是否正常 -->
    <target name="file" xsi:type="File" fileName="c:\temp\nlog-test.log" layout="${longdate} ${level} ${message}" />
    <!-- 暂时注释数据库目标 -->
    <!-- <target name="database" xsi:type="Database" connectionString="${appsettings:name=ConnectionStrings.DefaultConnection}">
      <commandText>
        insert into dbo.WebLog ( Application, Logged, Level, Message, Logger, CallSite, Exception )
        values ( @Application, @Logged, @Level, @Message, @Logger, @CallSite, @Exception );
      </commandText>
      <parameter name="@Application" layout="AspNetCoreNlog" />
      <parameter name="@Logged" layout="${date}" />
      <parameter name="@Level" layout="${level}" />
      <parameter name="@Message" layout="${message}" />
      <parameter name="@Logger" layout="${logger}" />
      <parameter name="@CallSite" layout="${callsite:filename=true}" />
      <parameter name="@Exception" layout="${exception:tostring}" />
    </target> -->
  </targets>

  <rules>
    <logger name="*" minlevel="Info" writeTo="file" />
    <!-- <logger name="*" minlevel="Info" writeTo="database" /> -->
  </rules>
</nlog>

如果这个简化配置能正常启动,说明问题确实出在数据库目标的配置上,再逐步恢复数据库配置,每改一处就测试启动,直到找到具体的错误点


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 12:33:14