暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

NLog 将日志记录到 SQL Server 数据库

后端Q 2024-10-27
178

NLog 是一个流行的.NET日志记录框架,它提供了灵活的配置选项和强大的功能,使得开发者能够方便地记录和管理应用程序的日志信息。本文将详细介绍如何配置NLog,以便将日志记录到SQL Server数据库中,并给出具体的例子代码。

环境准备

1. 创建数据库和表

首先,你需要在SQL Server中创建一个数据库和日志表。以下是一个简单的日志表创建示例:

USE [YourDatabaseName]
GO

CREATE TABLE [dbo].[Sys_Logs](
    [ID] [BIGINTIDENTITY(1,1NOT NULL,
    [Logger] [NVARCHAR](250NULL,
    [Level] [NVARCHAR](50NULL,
    [Host] [NVARCHAR](250NULL,
    [Url] [NVARCHAR](500NULL,
    [Method] [NVARCHAR](50NULL,
    [Cookie] [NVARCHAR](500NULL,
    [UserAgent] [NVARCHAR](500NULL,
    [QueryString] [NVARCHAR](MAXNULL,
    [Body] [NVARCHAR](MAXNULL,
    [Message] [NVARCHAR](MAXNULL,
    [CreateTime] [DATETIME] NOT NULL,
    [IPAddress] [NVARCHAR](50NULL,
    [Elapsed] [BIGINTNULL,
    [UserId] [BIGINTNULL,
    [UserName] [NVARCHAR](100NULL,
    [ProjectName] [NVARCHAR](100NULL,
    CONSTRAINT [PK_Sys_Logs] PRIMARY KEY CLUSTERED 
    (
        [IDASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ONON [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配置以及日志记录逻辑。


文章转载自后端Q,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论