Использование Nlog с базой данных SQL Server

#c# #asp.net-web-api #.net-core #nlog

#c# #asp.net-web-api #.net-ядро #nlog

Вопрос:

Я хочу использовать nlog с базой данных SQL Server. Я прочитал официальную документацию и несколько разных статей об этом. Я подключил nlog к своему проекту, и проект был успешно собран.

Но когда я начинаю отладку, в базе данных ничего не записывается. Я не вижу никаких ошибок в Visual Studio. Когда я пишу в just file, используя nlog, все работает хорошо. Я использовал Entity Framework Core для создания таблицы nlog. Я использую ту же строку подключения appsettings.json , и это работает хорошо.

Я не понимаю, где я совершаю ошибку.

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"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:tempnlog-internal.log">
  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>  
  <targets>
    <target xsi:type="Database"
            name="dblog"
            connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=AyanaDB;integrated security=True;MultipleActiveResultSets=True;"
            commandText="INSERT INTO [dbo].[NLogs] ([CallSite], [Date], [Exception], [Level], [Logger], [MachineName], [Message], [StackTrace], [Thread], [Username])
                         VALUES (@CallSite, @Date, @Exception, @Level, @Logger, @MachineName, @Message, @StackTrace, @Thread, @Username);">
      <parameter name="@CallSite" layout="${callsite:filename=true}" />
      <parameter name="@Date" layout="${longdate}" />
      <parameter name="@Exception" layout="${exception}" />
      <parameter name="@Level" layout="${level}" />
      <parameter name="@Logger" layout="${logger}" />
      <parameter name="@MachineName" layout="${machinename}" />
      <parameter name="@Message" layout="${message}" />
      <parameter name="@StackTrace" layout="${stacktrace}" />
      <parameter name="@Thread" layout="${threadid}" />
      <parameter name="@Username" layout="${windows-identity:domain=true}" />
    </target>
  </targets>
  <rules>
    <logger name="*" minlevel="Trace" writeTo="dblog" />
  </rules>
</nlog>
  

Program.cs:

 public class Program
{
    public static void Main(string[] args)
    {
        var logger = NLogBuilder.ConfigureNLog("NLog.config").GetCurrentClassLogger();

        try
        {
            logger.Debug("init main");
            CreateHostBuilder(args).Build().Run();
        }
        catch (Exception exception)
        {
            logger.Error(exception, "Stopped program because of exception");
            throw;
        }
        finally
        {
            LogManager.Shutdown();
        }
    }

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

Пример использования Nlog в коде:

 public class EveningWorkService : IEveningWorkService
{
    public EveningWorkService(AyDbContext ayDbContext,
                              IRutorService rutorService,
                              IDriverService driverService,
                              ISoftService softService,
                              ILogService logService,
                              ILogger<EveningWorkService> logger)
    {
        _context = ayDbContext;
        _rutorService = rutorService;
        _driverService = driverService;
        _softService = softService;
        _logService = logService;
        _logger = logger;
        logger.LogInformation("It's work!");
    }
  

NLog.cs:

 public class NLog
{
    public int Id { get; set; }
    public string CallSite { get; set; }
    public DateTime Date { get; set; }
    public string Message { get; set; }
    public string Exception { get; set; }
    public string Level { get; set; }
    public string Logger { get; set; }
    public string MachineName { get; set; }
    public string StackTrace { get; set; }
    public string Thread { get; set; }
    public string Username { get; set; }
}
  

Весь файл проекта вы можете увидеть там.

Комментарии:

1. Проверьте github.com/NLog/NLog/wiki/Logging-troubleshooting . Вероятно, хорошей идеей будет активировать внутренний регистратор NLog и проверить наличие предупреждений / ошибок.

2. @RolfKristensen Большое спасибо. Это действительно помогло мне. Ошибка была в «$ {windows-identity:domain = true}».

3. Возможно, заменить на ${environment-user} . Смотрите также github.com/NLog/NLog/wiki/Environment-User-Layout-Renderer

4. @RolfKristensen Да, с ${environment-user} работает хорошо. Большое спасибо.)

Ответ №1:

По ${windows-identity} умолчанию он недоступен в .NET Core:

 <parameter name="@Username" layout="${windows-identity:domain=true}" />
  

Вы должны установить nuget-package. Смотрите также: https://github.com/NLog/NLog/wiki/Windows-Identity-Layout-Renderer

Альтернативный вариант, который вы можете изменить на ${environment-user} :

 <parameter name="@Username" layout="${environment-user}" />
  

Смотрите также: https://github.com/NLog/NLog/wiki/Environment-User-Layout-Renderer