将 Nlog 与 SQL 服务器数据库一起使用
Using Nlog with SQL Server database
我想将 nlog 与 SQL 服务器数据库一起使用。我阅读了官方文档和一些关于它的不同文章。我将nlog连接到我的项目中,项目构建成功。
但是当我开始调试时,在数据库中什么也没写。我在 Visual Studio 中没有看到任何错误。当我只写文件时,使用 nlog,一切正常。我使用 Entity Framework Core 来创建 nlog 的 table。我在 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:\temp\nlog-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; }
}
您可以看到所有项目的文件there。
默认情况下,${windows-identity}
在 .NET Core 上不可用:
<parameter name="@Username" layout="${windows-identity:domain=true}" />
您必须安装 nuget-package. See also: 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
我想将 nlog 与 SQL 服务器数据库一起使用。我阅读了官方文档和一些关于它的不同文章。我将nlog连接到我的项目中,项目构建成功。
但是当我开始调试时,在数据库中什么也没写。我在 Visual Studio 中没有看到任何错误。当我只写文件时,使用 nlog,一切正常。我使用 Entity Framework Core 来创建 nlog 的 table。我在 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:\temp\nlog-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; }
}
您可以看到所有项目的文件there。
默认情况下,${windows-identity}
在 .NET Core 上不可用:
<parameter name="@Username" layout="${windows-identity:domain=true}" />
您必须安装 nuget-package. See also: 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