NLog 將日志記錄到 SQL Server 數據庫
NLog 是一個流行的.NET日志記錄框架,它提供了靈活的配置選項和強大的功能,使得開發者能夠方便地記錄和管理應用程序的日志信息。本文將詳細介紹如何配置NLog,以便將日志記錄到SQL Server數據庫中,并給出具體的例子代碼。
環境準備
1. 創建數據庫和表
首先,你需要在SQL Server中創建一個數據庫和日志表。以下是一個簡單的日志表創建示例:
USE [YourDatabaseName]
GO
CREATE TABLE [dbo].[Sys_Logs](
[ID] [BIGINT] IDENTITY(1,1) NOT NULL,
[Logger] [NVARCHAR](250) NULL,
[Level] [NVARCHAR](50) NULL,
[Host] [NVARCHAR](250) NULL,
[Url] [NVARCHAR](500) NULL,
[Method] [NVARCHAR](50) NULL,
[Cookie] [NVARCHAR](500) NULL,
[UserAgent] [NVARCHAR](500) NULL,
[QueryString] [NVARCHAR](MAX) NULL,
[Body] [NVARCHAR](MAX) NULL,
[Message] [NVARCHAR](MAX) NULL,
[CreateTime] [DATETIME] NOT NULL,
[IPAddress] [NVARCHAR](50) NULL,
[Elapsed] [BIGINT] NULL,
[UserId] [BIGINT] NULL,
[UserName] [NVARCHAR](100) NULL,
[ProjectName] [NVARCHAR](100) NULL,
CONSTRAINT [PK_Sys_Logs] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
2. 安裝NLog相關NuGet包
在你的.NET項目中,通過NuGet包管理器安裝NLog及其相關包。通常你需要安裝以下包:
- NLog
- NLog.Database(可選,取決于你的具體需求)
- NLog.Web.AspNetCore(如果你的項目是基于ASP.NET Core的)
- Microsoft.Data.SqlClient(用于連接到SQL Server)
- 配置NLog
3. 創建并配置nlog.config文件
在項目中添加一個XML文件,命名為nlog.config,并配置如下:
<?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"
throwExceptions="false"
internalLogLevel="Error"
internalLogFile="c:\temp\nlog-internal.log">
<extensions>
<add assembly="NLog.Web.AspNetCore"/>
</extensions>
<targets>
<target name="database" xsi:type="Database" dbProvider="System.Data.SqlClient.SqlConnection, System.Data"
connectionString="Server=127.0.0.1;Database=YourDatabaseName;User ID=yourUser;Password=yourPassword;">
<commandText>
INSERT INTO Sys_Logs (Logger, Level, Host, Url, Method, Cookie, UserAgent, QueryString, Body, Message, CreateTime, IPAddress, Elapsed, UserId, UserName, ProjectName)
VALUES (@Logger, @Level, @Host, @Url, @Method, @Cookie, @UserAgent, @QueryString, @Body, @Message, @CreateTime, @IPAddress, @Elapsed, @UserId, @UserName, 'YourProjectName');
</commandText>
<parameter name="@Logger" layout="${logger}" />
<parameter name="@Level" layout="${uppercase:${level}}" />
<parameter name="@Host" layout="${aspnet-request-host}" />
<parameter name="@Url" layout="${aspnet-request-url:IncludeScheme=false:IncludeHost=false}" />
<parameter name="@Method" layout="${aspnet-request-method}" />
<parameter name="@Cookie" layout="${aspnet-request-headers:HeaderNames=SYSTOKEN:ValuesOnly=true}" />
<parameter name="@UserAgent" layout="${aspnet-request-useragent}" />
<parameter name="@QueryString" layout="${aspnet-request-querystring:OutputFormat=JSON}" />
<parameter name="@Body" layout="${event-properties:item=RequestBody}" />
<parameter name="@Message" layout="${message}" />
<parameter name="@CreateTime" layout="${longdate}" />
<parameter name="@IPAddress" layout="${aspnet-request-ip}" />
<parameter name="@Elapsed" layout="${event-properties:item=Elapsed}" />
<parameter name="@UserId" layout="${event-properties:item=UserId}" />
<parameter name="@UserName" layout="${event-properties:item=UserName}" />
</target>
<!-- 其他目標配置(如文件、控制臺等) -->
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="database" />
</rules>
</nlog>
注意:根據你的實際需求,你可能需要調整日志表字段、連接字符串、日志級別等配置。
4. 在代碼中配置NLog
在你的.NET Core或.NET 5/6/7項目中,通常需要在Program.cs或Startup.cs中配置NLog,以便在應用程序啟動時加載nlog.config配置。
以.NET 6為例,你可以在Program.cs中添加如下配置:
using NLog.Web;
var builder = WebApplication.CreateBuilder(args);
// 配置NLog
builder.Logging.ClearProviders();
builder.Host.UseNLog(); // 確保這行代碼在builder.Build()之前調用
// 加載nlog.config配置,并可選地設置連接字符串變量
NLogBuilder.ConfigureNLog("nlog.config");
LogManager.Configuration.Variables["connectionString"] = builder.Configuration.GetConnectionString("DefaultConnection");
// 其他配置...
var app = builder.Build();
// 配置全局異常捕獲等(可選)
// ...
app.Run();
注意:如果你的項目是基于ASP.NET Core的,并且你使用了NLog.Web.AspNetCore包,那么builder.Host.UseNLog();這行代碼是必須的,它確保了NLog能夠集成到ASP.NET Core的日志系統中。
日志記錄
在應用程序的任何地方,你都可以通過注入ILogger接口或使用LogManager來記錄日志。以下是一個簡單的日志記錄示例:
using Microsoft.Extensions.Logging;
public class MyService
{
private readonly ILogger<MyService> _logger;
public MyService(ILogger<MyService> logger)
{
_logger = logger;
}
public void DoSomething()
{
_logger.LogInformation("Doing something...");
// 假設這里發生了一個異常
try
{
// 你的代碼邏輯
throw new InvalidOperationException("Something went wrong!");
}
catch (Exception ex)
{
_logger.LogError(ex, "An error occurred");
}
}
}
總結
通過上述步驟,你可以成功地將NLog配置為將日志記錄到SQL Server數據庫中。這種配置方式提供了靈活性和強大的功能,使得開發者能夠方便地監控和管理應用程序的日志信息。在實際應用中,根據項目的具體需求,你可能需要調整日志表結構、NLog配置以及日志記錄邏輯。