.Net6使用NLog日志写入SQL server

琢磨了很久,也看了很多文章。但是还是无法写入数据库。后面去看了官方文档 跟着官方文档来才勉强可以。不止SQL server 里面还有很多选择

官方文档
https://github.com/NLog/NLog.Web

先安装包 官方的说法是安装最新的

在这里插入图片描述

以下就是根据自己的项目来选择框架,我目前用的是 6

在这里插入图片描述

选择进去之后就可以自行根据自己的环境来配置

在这里插入图片描述

标红的地方就是关于数据库的配置,简直是配置数据库大全。自己按需引入。

以下是我的代码

nlog.config 文件 注意配置自己的连接字符串

nlog.config官方说法全部小写 并且放在根目录下。我是放在和 appsettings.json 同级的
<?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">

	<!-- enable asp.net core layout renderers -->
	<extensions>
		<add assembly="NLog.Web.AspNetCore"/>
	</extensions>

	<!-- the targets to write to -->
	<targets>
		<!-- File Target for all log messages with basic details -->
		<target xsi:type="File" name="allfile" fileName="c:\temp\nlog-AspNetCore-all-${shortdate}.log"
				layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}" />

		<!-- File Target for own log messages with extra web details using some ASP.NET core renderers -->
		<target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-AspNetCore-own-${shortdate}.log"
				layout="${longdate}|${event-properties:item=EventId:whenEmpty=0}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|${callsite}" />

		<!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection -->
		<target xsi:type="Console" name="lifetimeConsole" layout="${MicrosoftConsoleLayout}" />

		<target name="database" xsi:type="Database">
			<connectionString>server=xxxx;Database=xx;user id=sa;password=xxxx</connectionString>

			<!--
				  Script for creating the dbo.Log table.
      
				  SET ANSI_NULLS ON
				  SET QUOTED_IDENTIFIER ON
				  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]
			 -->

			<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 to map from logger name to target -->
	<rules>
		<!--All logs, including from Microsoft-->
		<!--至少Info级别以上:写入数据库-->
		<logger name="*" minlevel="Info" writeTo="database" />

		
		<!--Output hosting lifetime messages to console target for faster startup detection -->
		
		<!--Skip non-critical Microsoft logs and so log only own logs (BlackHole) -->
		
		<!--写入各个文件,看自己项目需求-->
		<!--<logger name="*" minlevel="Trace" writeTo="allfile" />
		<logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="lifetimeConsole, ownFile-web" final="true" />
		<logger name="Microsoft.*" maxlevel="Info" final="true" />
		<logger name="System.Net.Http.*" maxlevel="Info" final="true" />
		<logger name="*" minlevel="Trace" writeTo="ownFile-web" />-->
	</rules>
</nlog>

创建数据库语句

  SET ANSI_NULLS ON
				  SET QUOTED_IDENTIFIER ON
				  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]

Program 配置

using NLog.Web;
using NLog;


var logger = NLog.LogManager.Setup().LoadConfigurationFromAppSettings().GetCurrentClassLogger();
//logger.Debug("init main");
try
{
    var builder = WebApplication.CreateBuilder(args);

    // Add services to the container.

    builder.Services.AddControllers();
    // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();

    builder.Logging.AddNLog("nlog.config");

    var app = builder.Build();

    // Configure the HTTP request pipeline.
    if (app.Environment.IsDevelopment())
    {
        app.UseSwagger();
        app.UseSwaggerUI();
    }

    app.UseHttpsRedirection();

    app.UseAuthorization();

    app.MapControllers();

    app.Run();
}
catch (Exception exception)
{
    // NLog: catch setup errors
    logger.Error(exception, "Stopped program because of exception");
    throw;
}
finally
{
    // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
    NLog.LogManager.Shutdown();
}
最后随便取一个控制器依赖注入就可以了。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是使用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表中插入一条日志记录。 希望这可以帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值