在ASP.NET Core中使用高级NLog功能

NLog是一个开源的轻量级日志记录平台,具有丰富的日志路由和管理功能。 NLog也易于配置和扩展。 在先前的文章中,我已经讨论过在.NET中 使用NLog在ASP.NET Core使用NLog 。 在本文中,我将讨论如何使用NLog执行更高级的操作。

具体来说,我们将研究如何使用.config文件以及基于代码的配置来配置NLog,如何自动轮换日志,如何将数据库用作日志目标,以及如何通过异步记录数据来提高性能。 我还将分享一些使用NLog的最佳实践。

[使用Visual Studio代码? 不要为每个开发人员错过这10个Visual Studio Code扩展 •或者您不知道需要的7个Visual Studio Code扩展 | 通过InfoWorld的App Dev Report新闻通讯了解编程方面的热门话题。 ]

在Visual Studio中创建一个ASP.NET Core MVC项目

首先,让我们在Visual Studio 2019中创建一个ASP.NET Core项目。假设系统中安装了Visual Studio 2019,请按照下面概述的步骤在Visual Studio中创建一个新的ASP.NET Core MVC项目。

  1. 启动Visual Studio IDE。
  2. 点击“创建新项目”。
  3. 在“创建新项目”窗口中,从显示的模板列表中选择“ ASP.NET Core Web应用程序”。
  4. 点击下一步。
  5. 在“配置新项目”窗口中,指定新项目的名称和位置。
  6. (可选)选中“将解决方案和项目放在同一目录中”复选框。
  7. 单击创建。
  8. 在接下来显示的“创建新的ASP.NET Core Web应用程序”窗口中,从顶部的下拉列表中选择.NET Core作为运行时,并选择ASP.NET Core 2.2(或更高版本)。
  9. 选择“ Web应用程序(Model-View-Controller)”作为项目模板,以创建新的ASP.NET Core MVC应用程序。
  10. 确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不使用这些功能。
  11. 确保将身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
  12. 单击创建。

我们将在以下各节中使用该项目来说明如何在ASP.NET Core MVC中使用NLog。

为NLog安装NuGet软件包

接下来,通过NuGet软件包管理器或NuGet软件包管理器控制台安装以下软件包。

  • NLog.Web.AspNetCore
  • NLog.Extensions.Logging
  • NLog.Config

当您安装NLog.Config软件包时,一个名为NLog.config的文件及其依赖项将被添加到您的项目中。 请注意,使用NLog不需要NLog.Config程序包。 仅当您要使用配置文件而不是基于代码的配置来使用NLog时才需要使用它。

使用.config文件配置NLog

NLog为基于.config文件的配置和基于代码的配置提供支持。 在项目中安装NLog.Config程序包后,将在项目中创建一个名为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"
autoReload="true">
  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>
  <targets>
    <target name="logfile" xsi:type="File" fileName="D:\logs\LogMessages-${shortdate}.log" />
  </targets>
  <rules>
    <logger name="*" minlevel="Trace" writeTo="logfile" />
  </rules>
</nlog>

以下代码段说明了如何使用NLog在操作方法中记录数据。

public class HomeController : Controller
 {
     Logger _logger =
     (Logger)LogManager.GetCurrentClassLogger(typeof(Logger));  
     public IActionResult Index()
      {
         _logger.Info("Application started");       
          return View();
      }
    //Other action methods
  }

如果要以编程方式查找目标,则可以使用以下代码。

var fileTarget = (FileTarget)LogManager.Configuration.FindTargetByName("logfile");

使用基于代码的配置来配置NLog

您也可以通过编程方式配置NLog。 为此,您需要利用NLog API。 以下方法说明了我们如何以编程方式配置NLog。

private static void ConfigureNLog()
        {
            var logConfiguration = new LoggingConfiguration();
            var dbTarget = new DatabaseTarget();
            dbTarget.ConnectionString = "Data Source=JOYDIP;initial
            catalog=NLogDemo;User Id=sa;Password=sa1@3#.;";
            dbTarget.CommandText = "INSERT INTO DbLog
           (level, callsite, message, logdatetime)" +
                " Values(@level, @callsite, @message, @logdatetime)";
            dbTarget.Parameters.Add
            (new DatabaseParameterInfo("@level", "${level}"));
            dbTarget.Parameters.Add
            (new DatabaseParameterInfo("@callSite", "${callSite}"));
            dbTarget.Parameters.Add
            (new DatabaseParameterInfo("@message", "${message}"));
            dbTarget.Parameters.Add
            (new DatabaseParameterInfo("@logdatetime","${date:s}"));
            var rule = new LoggingRule("*", LogLevel.Debug, dbTarget);
            logConfiguration.LoggingRules.Add(rule);
            LogManager.Configuration = logConfiguration;
        }

使用NLog自动轮换日志

您可以将NLog配置为自动轮换您的日志。 例如,您可以将其配置为保留最近n天的日志并自动删除其余日志。 此功能在生产环境中非常有用,在生产环境中,您通常需要删除旧的日志文件。 以下代码段说明了如何使用基于.config文件的配置在NLog中实现自动日志轮换。

<?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"
autoReload="true">
      <targets>
    <target name="logfile"
            xsi:type="File"
            fileName="${basedir}/logs/App.log"
            layout="${longdate}  ${message}"
            archiveFileName="${basedir}/logs/archive.{#}.log"
            archiveEvery="Day"
            archiveNumbering="Rolling"
            maxArchiveFiles="7"
            concurrentWrites="true"
            keepFileOpen="true" />
  </targets>
  <rules>
    <logger name="*" minlevel="Info" writeTo="logfile" />
  </rules>
</nlog>

使用NLog登录到数据库

创建数据库表

您也可以使用NLog将数据记录到数据库。 这是用于在数据库中创建表的脚本,我们将使用该脚本记录数据。

CREATE TABLE [dbo].[DbLog](
      [Id] [int] IDENTITY(1,1) NOT NULL,
      [Level] [varchar](max) NULL,
      [CallSite] [varchar](max) NULL,
      [Message] [varchar](max) NULL,
      [AdditionalInfo] [varchar](max) NULL,
      [LogDateTime] [datetime] NOT NULL,
 CONSTRAINT [PK_DbLogs] 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] TEXTIMAGE_ON [PRIMARY]
GO

指定数据库连接字符串和命令文本属性

您需要指定数据库连接的详细信息,如下面给出的代码片段所示。 请注意如何使用connectionString和commandText属性。

<target name="database" xsi:type="Database" keepConnection="true"
 useTransactions="true"
 dbProvider="System.Data.SqlClient"
 connectionString="data source=localhost;initial
 catalog=NLogDemo;integrated security=false;
 persist security info=True;User ID=sa;Password=sa1@3#."
 commandText="INSERT INTO DbLog (level, callsite, message, additionalInfo,
 logdatetime) Values (@level, @callsite, @message, @additionalInfo,
 @logdatetime)">

在NLog.config中指定日志目标

接下来,您应该在NLog.config文件中指定目标,以便可以将数据记录到数据库中。

<target name="database" xsi:type="Database" keepConnection="true" useTransactions="true" dbProvider="System.Data.SqlClient"
connectionString="data source=localhost;initial catalog=NLogDemo;integrated security=false;persist security info=True;User ID=sa;Password=sa1@3#."
commandText="INSERT INTO DbLog (level, callsite, message, additionalInfo, logdatetime) Values (@level, @callsite, @message, @additionalInfo, @logdatetime)">
</target>

将参数从NLog布局映射到数据库

最后,您应该使用参数标签映射参数,如下面的代码段所示。

<parameter name="@level" layout="${level}" />
<parameter name="@callSite" layout="${callsite}" />
<parameter name="@message" layout="${message}" />
<parameter name="@additionalInfo" layout="${var:AdditionalInfo}" />
<parameter name="@logdatetime" layout="${date:s}" />

使用NLog登录到数据库-完整的NLog.config

下面提供了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"
autoReload="true">
  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
  </extensions>
  <variable name="AdditionalInfo" value=""/> 
  <targets>
    <target name="database" xsi:type="Database" keepConnection="true"
    useTransactions="true"
    dbProvider="System.Data.SqlClient"
    connectionString="data source=localhost;initial
    catalog=NLogDemo;integrated security=false;persist security  
    info=True;User ID=sa;Password=sa1@3#."
    commandText="INSERT INTO DbLog
    (level, callsite, message, additionalInfo, logdatetime)
    Values (@level, @callsite, @message, @additionalInfo, @logdatetime)">
      <parameter name="@level" layout="${level}" />
      <parameter name="@callSite" layout="${callsite}" />
      <parameter name="@message" layout="${message}" />
      <parameter name="@additionalInfo" layout="${var:AdditionalInfo}" />
      <parameter name="@logdatetime" layout="${date:s}" />
    </target>       
  </targets>
  <rules>
    <logger levels="Debug,Info,Error,Warn,Fatal" name="databaseLogger" writeTo="database"/>
  </rules>
</nlog>

除了Microsoft SQL Server,您还可以使用NLog将数据记录到其他数据库,例如MySQL,Oracle数据库和SQLite。

使用AsyncWrapper提高NLog性能

NLog支持多种目标,例如AsyncWrapper,BufferingWrapper,FallbackGroup和RetryingWrapper。 异步目标包装器使您可以将消息排队并在单独的线程中处理它们,以提高性能。 以下代码段说明了使用AsyncWrapper的语法。

<targets>
  <target xsi:type="AsyncWrapper"
          name="String"
          queueLimit="Integer"
          timeToSleepBetweenBatches="Integer"
          batchSize="Integer"
          overflowAction="Enum">
    <target ... />
  </target>
</targets>

您可以利用异步包装器并在其中包装文件目标,以将数据异步记录到文件中,如下面给出的代码片段所示。

<targets>
    <target name="asyncFile" xsi:type="AsyncWrapper">
      <target xsi:type="File" name="fileLog"
         fileName="${basedir}/Logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}"/>
    </target>
  </targets>
  <rules>
    <logger levels="Debug,Info,Error,Warn,Fatal" writeTo="asyncFile"/>
  </rules>

或者,您可以使用以下代码使用AsyncWrapper包装所有目标。

<targets async="true">
  ... Write your targets here ...
</targets>

使用NLog的最佳做法

本节列出了使用NLog时应遵循的一些最佳实践。

1.记录器实例应为静态。 这是为了避免需要多次创建记录器实例时产生的处理开销。

2.利用NLog对格式的支持(当您需要使用NLog进行结构化日志记录时),以避免字符串分配和连接。

3.指定throwConfigExceptions="true"以确保如果NLog配置存在问题,NLog将提供详细信息。 例如:

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true" throwConfigExceptions="true">

4.使用NLog记录数据完成后,调用LogManager类的Shutdown()方法以刷新和关闭所有内部线程和计时器:

NLog.LogManager.Shutdown();

5.确保您尚未将Async属性与AsyncWrapper结合在一起。 如果将它们组合在一起,处理将很慢。

6.您应该不经常使用日志级别的跟踪,因为跟踪暗示您正在记录所有内容。 考虑改用日志级别Debug或Info。

7.尽管NLog轻巧且快速,但您可以使用异步包装器进一步提高性能。

关于NLog还有很多要说的。 如上所述,NLog也提供对结构化日志的支持。 此外,您现在可以轻松过滤和分析大量日志数据。 我将在以后的文章中讨论NLog的这些和更多功能。

翻译自: https://www.infoworld.com/article/3438540/using-advanced-nlog-features-in-aspnet-core.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值