首页 > 解决方案 > 将 NLog 与 Sql Server 一起使用

问题描述

我正在尝试使用 NLog 将错误记录到数据库表中,但没有记录被写入数据库。我在这里想念什么?

启动.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;            
    }


    public void Configure(IApplicationBuilder app, IHostingEnvironment env, IHttpContextAccessor httpContextAccessor, 
        IOptions<MailSettings> mailConfig, IOptions<ApplicationSettings> applicationSettings, ILoggerFactory loggerFactory)
    {           

        app.UseMvc();

        GlobalDiagnosticsContext.Set("connectionString", ConnectionString.Connection);//Set the database connection string

        loggerFactory.AddNLog();
    }

}

然后我创建了以下数据库表

      CREATE TABLE [dbo].[Log] (
      [Id] [int] IDENTITY(1,1) NOT NULL,
      [Application] [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]

并尝试在此处记录一些错误。

public class ValuesController : ControllerBase
{
    private readonly ILogger _logger;

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

    // GET api/values
    [HttpGet]
    public async Task<ActionResult<IEnumerable<string>>> GetAsync()
    {
        _logger.LogError("just test");

    }
}

标签: c#asp.net-corenlogcore-api

解决方案


您需要先使用 AddNLog 扩展方法app.UserMVC

public void Configure(IApplicationBuilder app, IHostingEnvironment env,IHttpContextAccessor httpContextAccessor, 
    IOptions<MailSettings> mailConfig, IOptions<ApplicationSettings> applicationSettings,ILoggerFactory loggerFactory)
{

   GlobalDiagnosticsContext.Set("connectionString", ConnectionString.Connection);
   loggerFactory.AddNLog();

   app.UseMvc();
}

并在 Program.cs 中设置

public static class Program
{
    public static void Main(string[] args)
    {            
        GlobalDiagnosticsContext.Set("connectionString", YourConnectionString);

        var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
        try
        {
            //logger.Debug("init main");
            BuildWebHost(args).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();
        }
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
            })
            .UseNLog()  // NLog: Setup NLog for Dependency injection
            .Build();
}

参考https://github.com/damienbod/AspNetCoreNlog


推荐阅读