asp.net core web api NLog存入Sqlserver

161 阅读1分钟

以下方法为个人实现,其中遇到的问题我也有指出来

GitHub地址:github.com/NLog/NLog/w…

第一步、引入包

这里我试过NLogNLog.Web.AspNetCore更新成5.*或者是最新的都会无法写入数据库,也不知道是什么问题,暂且就这样实现吧

    <PackageReference Include="System.Data.SqlClient" Version="4.8.3" />
    <PackageReference Include="NLog" Version="4.7.15" />
    <PackageReference Include="NLog.Web.AspNetCore" Version="4.15.0" />

第二步、数据库中创建表

 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]

第三步、创建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="D:\temp\internal-nlog-AspNetCore.txt">

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

  <targets>
    <target name="database" xsi:type="Database">
  <connectionString>server=.;Database=TestDB;user id=sa;password=111111</connectionString>
    
  <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="testdbnlog.*" minlevel="Trace" writeTo="database" />
  </rules>
</nlog>

第四步、修改Program.cs文件

using NLog;
using NLog.Web;

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.Logging.ClearProviders();
    builder.Host.UseNLog();
    builder.Services.AddSwaggerGen();

    var app = builder.Build();

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

    app.UseHttpsRedirection();

    app.UseAuthorization();

    app.MapControllers();

    app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

    app.Run();
}
catch (Exception exception)
{
    logger.Error(exception, "Stopped program because of exception");
    throw;
}
finally
{
    NLog.LogManager.Shutdown();
}

第五步、控制器使用日志

using Microsoft.AspNetCore.Mvc;

namespace testdbnlog.Controllers;

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{

    private readonly ILogger<WeatherForecastController> _logger;

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

    [HttpGet(Name = "GetWeatherForecast")]
    public string Get()
    {

        _logger.LogTrace(Guid.NewGuid().ToString());
        _logger.LogTrace(Guid.NewGuid().ToString("N"));
        _logger.LogTrace(Guid.NewGuid().ToString("D"));
        _logger.LogTrace(Guid.NewGuid().ToString("B"));
        _logger.LogTrace(Guid.NewGuid().ToString("P"));
        _logger.LogTrace(Guid.NewGuid().ToString("X"));
        return "成功了!";
    }
}