ASP.NET Core 5.0环境下NLog异常日志无法写入数据库问题求助
问题排查步骤
1. 修正日志记录调用语法
你当前的LogError调用参数顺序错误,无法正确传入异常信息,也不符合ILogger的重载规则:
原错误写法:
this._logger.LogError($"---- Token Error ----", ex.Message);
正确写法(需要将异常对象作为第一个参数传入,才能让NLog捕获完整异常信息,同时匹配日志规则):
this._logger.LogError(ex, "---- Token Error ----");
2. 清理Program.cs中的重复NLog注册
ASP.NET Core 5.0中NLog的注册不需要同时调用UseNLog()和AddNLog(),重复注册会导致配置加载冲突,修改为如下写法即可:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging((hostingContext, logging) => { logging.ClearProviders(); logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging")); logging.SetMinimumLevel(LogLevel.Error); }) .UseNLog() // 仅保留此处的NLog注册即可 .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
3. 验证NLog.config配置正确性
- 确保NLog.config文件的属性设置为复制到输出目录:如果较新则复制,否则发布/运行时会加载不到更新后的配置
- 检查配置中数据库连接字符串是否正确读取了appsettings.json的节点,连接字符串示例:
<variable name="DbConnectionString" value="Server=${configsetting:name=NLogConnection.DbHost};Database=${configsetting:name=NLogConnection.Database};User Id=${configsetting:name=NLogConnection.User};Password=${configsetting:name=NLogConnection.Password};" />
- 检查日志规则是否配置了Error级别日志写入数据库目标,示例规则:
<logger name="*" minlevel="Error" writeTo="database" />
- 检查数据库目标的插入语句、字段映射是否和你SQL Server中的日志表结构完全匹配,字段类型、长度不匹配会导致写入失败
4. 开启NLog内部日志定位具体错误
在nlog.config的根节点<nlog>添加内部日志配置,可直接看到数据库写入失败的具体原因(比如连接报错、权限不足、表结构不匹配等):
<nlog internalLogLevel="Debug" internalLogFile="c:\temp\nlog-internal.log" > <!-- 原有配置内容 --> </nlog>
触发异常后查看c:\temp\nlog-internal.log的内容,即可定位具体的写入错误。
5. 验证数据库权限
确认你配置的数据库账号拥有对应日志表的INSERT权限,同时远程服务器允许你的应用服务器IP访问SQL Server的1433端口。
内容的提问来源于stack exchange,提问作者user12484971
相关产品推荐
相关产品推荐

