ASP.NET 5 中使用NLog将日志写入SQL Server遇问题求助
在ASP.NET 5中配置NLog将日志写入SQL Server
别担心,我帮你一步步梳理清楚ASP.NET 5里用NLog写日志到SQL Server的配置流程,之前.NET Core的经验其实可以复用,只是ASP.NET 5的启动配置略有不同:
1. 安装必要的NuGet包
首先得把NLog的核心集成包和数据库支持包装上,用DotNet CLI或者NuGet包管理器都可以:
- 安装NLog与ASP.NET Core的集成包:
dotnet add package NLog.Web.AspNetCore - 安装NLog的数据库目标支持包:
dotnet add package NLog.Database
2. 配置NLog.config文件
创建(或修改)你的NLog.config文件,记得在VS里把这个文件的复制到输出目录属性设置为「如果较新则复制」,不然运行时找不到配置。下面是完整的配置示例,你可以根据自己的需求调整字段和规则:
<?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" internalLogLevel="Info" internalLogFile="internal-nlog.txt"> <!-- 数据库目标配置 --> <targets> <target xsi:type="Database" name="sqlServerLog"> <!-- 从appsettings.json读取连接字符串,也可以直接写死在这里 --> <connectionString>${configsetting:name=ConnectionStrings.LoggingDatabase}</connectionString> <!-- 插入日志的SQL命令,对应你数据库里的日志表结构 --> <commandText> INSERT INTO Logs ( LogDateTime, LogLevel, Message, LoggerName, ExceptionDetails, MachineName, UserIdentity ) VALUES ( @LogDate, @Level, @Message, @Logger, @Exception, @MachineName, @UserName ); </commandText> <!-- 日志字段与SQL参数的映射 --> <parameter name="@LogDate" layout="${date:format=yyyy-MM-dd HH:mm:ss.fff}" /> <parameter name="@Level" layout="${level}" /> <parameter name="@Message" layout="${message}" /> <parameter name="@Logger" layout="${logger}" /> <parameter name="@Exception" layout="${exception:format=ToString,StackTrace}" /> <parameter name="@MachineName" layout="${machinename}" /> <parameter name="@UserName" layout="${aspnet-user-identity}" /> </target> </targets> <!-- 日志路由规则:指定哪些日志要写入数据库 --> <rules> <!-- 所有日志记录器、级别≥Info的日志都写入SQL Server --> <logger name="*" minlevel="Info" writeTo="sqlServerLog" /> <!-- 如果需要排除框架日志(比如Microsoft开头的),可以加过滤规则: <logger name="Microsoft.*" maxlevel="Info" final="true" /> --> </rules> </nlog>
3. 在appsettings.json中配置数据库连接字符串
打开appsettings.json,添加日志数据库的连接字符串:
{ "ConnectionStrings": { "LoggingDatabase": "Server=你的SQL服务器地址;Database=你的日志数据库名;Trusted_Connection=True;TrustServerCertificate=True;" } }
如果你用SQL Server身份验证,把连接字符串改成
Server=xxx;Database=xxx;User Id=xxx;Password=xxx;TrustServerCertificate=True;
4. 在Program.cs中启用NLog
ASP.NET 5的启动逻辑在Program.cs里,需要替换默认的日志提供器为NLog:
var builder = WebApplication.CreateBuilder(args); // 清除默认的日志提供器,避免重复日志输出 builder.Logging.ClearProviders(); // 设置最低日志级别(按需调整) builder.Logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); // 启用NLog作为日志提供器 builder.Host.UseNLog(); // 注册其他服务(比如MVC、Controllers等) builder.Services.AddControllersWithViews(); var app = builder.Build(); // 中间件配置... app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
5. 准备SQL Server的日志表
如果你的数据库里还没有日志表,执行下面的SQL脚本创建一个(可以根据需求增减字段):
CREATE TABLE Logs ( LogId INT IDENTITY(1,1) PRIMARY KEY, LogDateTime DATETIME NOT NULL, LogLevel NVARCHAR(50) NOT NULL, Message NVARCHAR(MAX) NOT NULL, LoggerName NVARCHAR(255), ExceptionDetails NVARCHAR(MAX), MachineName NVARCHAR(100), UserIdentity NVARCHAR(255) );
常见问题排查
- 如果日志没写入数据库,先看输出目录里的
internal-nlog.txt文件,里面会有详细的错误信息,比如连接字符串错误、表不存在、权限不足等。 - 确保应用程序的运行身份有SQL Server数据库的读写权限(比如用IIS的话,检查应用池身份的权限)。
- 确认NLog.config的复制属性设置正确,不然运行时加载不到配置。
内容的提问来源于stack exchange,提问作者Vas Mil
相关产品推荐
相关产品推荐

