ASP.NET Core 3.1系列(32)——NLog日志写入SQL Server数据库

32 篇文章 42 订阅
本文详细介绍了如何使用NLog将日志记录到SQLServer数据库,包括创建日志表、引入NLog相关组件、配置nlog.config文件、设置NLog为日志管理器以及在WebAPI控制器中生成日志的步骤。
摘要由CSDN通过智能技术生成

1、前言

前面介绍了NLog将日志写入文本文件的方法,下面就来介绍一下如何将日志写入SQL Server数据库。

2、创建数据表

SQL Server中新建一个数据库Dao,然后创建日志表Log,代码如下:

USE [Dao]
GO

/****** Object:  Table [dbo].[Log]    Script Date: 2023/2/7 14:39:28 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Log](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[MachineName] [nvarchar](50) NOT NULL,
	[Logged] [datetime] NOT NULL,
	[Level] [nvarchar](50) NOT NULL,
	[Message] [nvarchar](max) NOT NULL,
	[Logger] [nvarchar](250) NULL,
	[Callsite] [nvarchar](max) NULL,
	[Exception] [nvarchar](max) NULL,
 CONSTRAINT [PK_dbo.Log] 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]
GO

在这里插入图片描述

3、引入NLog

新建一个Web API工程,使用NuGet引入如下组件:

NLog
NLog.Database
NLog.Web.AspNetCore
Microsoft.Data.SqlClient

在这里插入图片描述

4、配置文件nlog.config

新建一个XML文件,文件名为nlog.config,如下图所示:

在这里插入图片描述

nlog.config文件改为始终复制,如下图所示:

在这里插入图片描述
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"
      internalLogLevel="Info"
      internalLogFile="c:\temp\internal-nlog-AspNetCore.txt">
	<extensions>
		<add assembly="NLog.Web.AspNetCore"/>
	</extensions>
	<targets>
		<target name="db" xsi:type="Database">
			<!-- 连接字符串 -->
			<connectionString>Data Source=rt-dongshenfeng;Initial Catalog=Dao;User ID=sa;Password=123456</connectionString>
			<!-- Insert语句 -->
			<commandText>
				insert into dbo.Log (MachineName,Logged,Level,Message,Logger,Callsite,Exception) values (@MachineName,@Logged,@Level,@Message,@Logger,@Callsite,@Exception);
			</commandText>
			<!-- 格式化参数 -->
			<parameter name="@MachineName" layout="${machinename}" />
			<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}" />
			<parameter name="@Exception" layout="${exception:tostring}" />
		</target>
	</targets>
	<rules>
		<logger name="Microsoft.*" minlevel="Trace" final="true" />
		<logger name="*" minlevel="Info" writeTo="db" />
	</rules>
</nlog>

如果要将日志写入数据库,则xsi:type的值为DatabaseconnectionString节点存放数据库连接字符串,commandText节点存放插入数据的SQLparameter节点定义格式化参数名称和对应的值。

5、设置NLog为日志管理器

修改Program.cs文件,代码如下:

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using NLog.Web;

namespace App
{
    public class Program
    {
        public static void Main(string[] args)
        {
            NLogBuilder.ConfigureNLog("nlog.config");
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                })
                .ConfigureLogging(logging=>
                {
                    logging.ClearProviders();
                })
                .UseNLog();
    }
}

6、生成日志

添加一个控制器HomeController,在其构造函数中注入ILogger接口,代码如下:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        protected readonly ILogger<HomeController> _logger;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }

        [HttpGet]
        public ActionResult<string> Get()
        {
            _logger.LogTrace("This is track info");
            _logger.LogDebug("This is debug info");
            _logger.LogInformation("This is info");
            _logger.LogWarning("This is warn info");
            _logger.LogError("This is error info");
            _logger.LogCritical("This is fatal info");
            return "Hello World";
        }
    }
}

运行程序,可以发现数据库中已经写入了日志,如下图所示:

在这里插入图片描述

7、结语

本文主要介绍了NLog日志写入SQL Server的操作方法。示例代码中所用的数据驱动为Microsoft.Data.SqlClient,如果开发者希望使用MySQLOracle,只需要切换对应的数据驱动即可。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,以下是使用NLog日志记录SqlServer的步骤: 1. 首先,需要在项目中安装NLogNLog.Web.AspNetCore包。可以使用NuGet包管理器或在项目文件中手动添加依赖项。 2. 在项目的appsettings.json文件中添加以下NLog配置: ``` "NLog": { "targets": { "database": { "type": "Database", "dbProvider": "System.Data.SqlClient", "connectionString": "Server=[server];Database=[database];User Id=[user];Password=[password];", "commandText": "INSERT INTO [Logs] ([Date], [Level], [Logger], [Message], [Exception]) VALUES (@Date, @Level, @Logger, @Message, @Exception);", "parameter": [ { "name": "@Date", "layout": "${date}" }, { "name": "@Level", "layout": "${level}" }, { "name": "@Logger", "layout": "${logger}" }, { "name": "@Message", "layout": "${message}" }, { "name": "@Exception", "layout": "${exception}" } ] } }, "rules": [ { "logger": "*", "minLevel": "Trace", "writeTo": "database" } ] } ``` 3. 在Startup.cs文件中添加以下代码: ```csharp public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) { //... loggerFactory.AddNLog(); //... app.UseMiddleware<NLogMiddleware>(); //... } ``` 4. 创建一个名为Logs的表,用于存储日志记录。表结构应如下所示: ```sql CREATE TABLE [dbo].[Logs]( [Id] [int] IDENTITY(1,1) NOT NULL, [Date] [datetime2](7) NOT NULL, [Level] [nvarchar](50) NOT NULL, [Logger] [nvarchar](250) NOT NULL, [Message] [nvarchar](max) NOT NULL, [Exception] [nvarchar](max) NULL, CONSTRAINT [PK_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] ``` 5. 现在,可以在代码中使用NLog记录日志了。例如: ```csharp private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger) { _logger = logger; } public IActionResult Index() { _logger.LogInformation("Hello, world!"); return View(); } ``` 这将在Logs表中插入一条日志记录。 希望这可以帮助到你。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值