NLog MySql .Net Core 3.0 日志记录不保存到数据库
NLog MySql .Net Core 3.0 logging not saving to database
我在我的项目上设置了 NLog,它将日志记录保存到我的审计数据库(与默认数据库分开)。但是,它无法写入数据库。我也有一个控制台记录器目标,并且按预期进行记录。没有显示或给出错误。它只是无法写入数据库。
我尝试了 google 提供的各种方法,但 none 似乎奏效了。我也尝试过使用 NLogBuilder 为该特定控制器配置配置,但它仍然没有写入数据库
nlog.config 文件:
<configSections>
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" />
</configSections>
<nlog internalLogLevel="Trace">
<targets>
<target name="ConsoleLogger" type="Console"
layout="${longdate}|${level:uppercase=true}|${logger}|${message}"/>
<target name="DatabaseLog" type="Database">
<commandtext>
INSERT INTO Logs
(LogDate, LogLevel, Message, Exception)
VALUES
(@log_date, @log_level, @message, @exception)
</commandtext>
<parameter name="@log_date"
layout="${log_date}"
dbType="DateTime"/>
<parameter name="@thread"
layout="${thread}"
dbType="String"
size="255"/>
<parameter name="@log_level"
layout="${log_level}"
dbType="String"
size="20" />
<parameter name="@logger"
layout="${logger}"
dbType="String"
size="250" />
<parameter name="@message"
layout="${message}"
dbType="String"
size="4000" />
<parameter name="@exception"
layout="${exception}"
dbType="String"
size="4000" />
<dbProvider>MySql.Data.MySqlClient.MySqlConnection, MySql.Data</dbProvider>
<connectionString>User Id=username;Password=password;Host=localhost;Database=audit_database;TreatTinyAsBoolean=false</connectionString>
</target>
</targets>
<rules>
<logger name="*" minlevel="Debug" maxlevel="Fatal" writeTo="ConsoleLogger,DatabaseLog" />
</rules>
</nlog>
控制器方法:
public static Logger _logger = LogManager.GetCurrentClassLogger(typeof(ActionerController));
_logger.Info("text");
Main.cs
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.AddNLog();
}).ConfigureAppConfiguration((hostingContext, config) =>
{
config
.AddJsonFile($"environment-mount/appsettings.json", optional: true)
.AddEnvironmentVariables();
}).ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
对于 MySQL,确保您已经安装了 MySql.Data 包。
你的配置和代码也有一些错误:
${log_date}
、${log_level}
和 ${thread}
不存在。我猜你的意思是 ${date}
、${level}
和 ${threadid}
。查看所有选项 here.
带有参数的 LogManager.GetCurrentClassLogger
需要记录器类型 - 因此继承自 NLog.Logger
。我认为您正在寻找 LogManager.GetCurrentClassLogger()
或 LogManager.GetLogger(typeof(ActionerController).FullName)
。参见 API docs
当然可能还有其他错误,例如错误的查询、错误的列名称或错误的列类型。 NLog 当然可以告诉你问题所在:
- 或启用例外。在您的配置中
<nlog throwExceptions=true >
- 或启用内部日志:
<nlog internalLogFile="c:\log.txt" internalLogLevel="Warn">
。阅读更多 here
我在我的项目上设置了 NLog,它将日志记录保存到我的审计数据库(与默认数据库分开)。但是,它无法写入数据库。我也有一个控制台记录器目标,并且按预期进行记录。没有显示或给出错误。它只是无法写入数据库。
我尝试了 google 提供的各种方法,但 none 似乎奏效了。我也尝试过使用 NLogBuilder 为该特定控制器配置配置,但它仍然没有写入数据库
nlog.config 文件:
<configSections>
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" />
</configSections>
<nlog internalLogLevel="Trace">
<targets>
<target name="ConsoleLogger" type="Console"
layout="${longdate}|${level:uppercase=true}|${logger}|${message}"/>
<target name="DatabaseLog" type="Database">
<commandtext>
INSERT INTO Logs
(LogDate, LogLevel, Message, Exception)
VALUES
(@log_date, @log_level, @message, @exception)
</commandtext>
<parameter name="@log_date"
layout="${log_date}"
dbType="DateTime"/>
<parameter name="@thread"
layout="${thread}"
dbType="String"
size="255"/>
<parameter name="@log_level"
layout="${log_level}"
dbType="String"
size="20" />
<parameter name="@logger"
layout="${logger}"
dbType="String"
size="250" />
<parameter name="@message"
layout="${message}"
dbType="String"
size="4000" />
<parameter name="@exception"
layout="${exception}"
dbType="String"
size="4000" />
<dbProvider>MySql.Data.MySqlClient.MySqlConnection, MySql.Data</dbProvider>
<connectionString>User Id=username;Password=password;Host=localhost;Database=audit_database;TreatTinyAsBoolean=false</connectionString>
</target>
</targets>
<rules>
<logger name="*" minlevel="Debug" maxlevel="Fatal" writeTo="ConsoleLogger,DatabaseLog" />
</rules>
</nlog>
控制器方法:
public static Logger _logger = LogManager.GetCurrentClassLogger(typeof(ActionerController));
_logger.Info("text");
Main.cs
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.ClearProviders();
logging.AddNLog();
}).ConfigureAppConfiguration((hostingContext, config) =>
{
config
.AddJsonFile($"environment-mount/appsettings.json", optional: true)
.AddEnvironmentVariables();
}).ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
对于 MySQL,确保您已经安装了 MySql.Data 包。
你的配置和代码也有一些错误:
${log_date}
、${log_level}
和${thread}
不存在。我猜你的意思是${date}
、${level}
和${threadid}
。查看所有选项 here.
带有参数的 LogManager.GetCurrentClassLogger
需要记录器类型 - 因此继承自NLog.Logger
。我认为您正在寻找LogManager.GetCurrentClassLogger()
或LogManager.GetLogger(typeof(ActionerController).FullName)
。参见 API docs
当然可能还有其他错误,例如错误的查询、错误的列名称或错误的列类型。 NLog 当然可以告诉你问题所在:
- 或启用例外。在您的配置中
<nlog throwExceptions=true >
- 或启用内部日志:
<nlog internalLogFile="c:\log.txt" internalLogLevel="Warn">
。阅读更多 here