【问题标题】:NLog MySql .Net Core 3.0 logging not saving to databaseNLog MySql .Net Core 3.0 日志记录未保存到数据库
【发布时间】:2020-02-06 12:46:30
【问题描述】:

我已经在我的项目上设置了 NLog,它将日志记录保存到我的审计数据库(与默认数据库分开)。但是,它无法写入数据库。我也有一个控制台记录器目标,并且按预期进行记录。没有显示或给出错误。它只是无法写入数据库。

我尝试了谷歌提供的各种方法,但似乎都没有奏效。我也尝试使用 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>();
    });

【问题讨论】:

  • .NET Core 不使用app.config 文件,NLog 的配置文件也不需要configSections。事实上,这是一个无效的 XML 文件,因为它有 两个 根元素。 This example 显示 nlog.config 应该是什么样子
  • 你在 NLog 的 repo 中检查过Getting Started with ASP.NET Core 3 吗?
  • 我经历了入门,我省略了依赖注入记录器的使用。将其添加进去。按照建议修复了配置,但它仍然不会登录到数据库。它只记录到控制台和文件。

标签: c# mysql database nlog .net-core-3.0


【解决方案1】:

对于 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 当然可以告诉你问题:

  • 或启用例外。在您的配置中&lt;nlog throwExceptions=true &gt;
  • 或启用内部日志:&lt;nlog internalLogFile="c:\log.txt" internalLogLevel="Warn"&gt;。阅读更多here

【讨论】:

  • 记录到文件有助于细化错误发生的位置,因为添加了 throw exceptions true。将线程更改为线程 ID 也可以。这是停止写入的 sql 字符串中的语法错误。正确答案是这个和来自 Panagiotis Kanavos 的 cmets。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 2021-12-26
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多