NLog是一个开源的轻量级日志记录平台,具有丰富的日志路由和管理功能。 NLog也易于配置和扩展。 在先前的文章中,我已经讨论过在.NET中 使用NLog和在ASP.NET Core中使用NLog 。 在本文中,我将讨论如何使用NLog执行更高级的操作。
具体来说,我们将研究如何使用.config文件以及基于代码的配置来配置NLog,如何自动轮换日志,如何将数据库用作日志目标,以及如何通过异步记录数据来提高性能。 我还将分享一些使用NLog的最佳实践。
在Visual Studio中创建一个ASP.NET Core MVC项目
首先,让我们在Visual Studio 2019中创建一个ASP.NET Core项目。假设系统中安装了Visual Studio 2019,请按照下面概述的步骤在Visual Studio中创建一个新的ASP.NET Core MVC项目。
- 启动Visual Studio IDE。
- 点击“创建新项目”。
- 在“创建新项目”窗口中,从显示的模板列表中选择“ ASP.NET Core Web应用程序”。
- 点击下一步。
- 在“配置新项目”窗口中,指定新项目的名称和位置。
- (可选)选中“将解决方案和项目放在同一目录中”复选框。
- 单击创建。
- 在接下来显示的“创建新的ASP.NET Core Web应用程序”窗口中,从顶部的下拉列表中选择.NET Core作为运行时,并选择ASP.NET Core 2.2(或更高版本)。
- 选择“ Web应用程序(Model-View-Controller)”作为项目模板,以创建新的ASP.NET Core MVC应用程序。
- 确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不使用这些功能。
- 确保将身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
- 单击创建。
我们将在以下各节中使用该项目来说明如何在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