如何在 ASP.NET Core 中使用 NLog 的高级特性

本文转载自微信公众号「 码农读书」,使用作者 码农读书 。使用转载本文请联系 码农读书公众号。使用

NLog 是使用一个开源的轻量级日志框架,提供了丰富的使用日志路由和管理功能,同时 NLog 也是使用非常容易的去配置和扩展,其实在之前的使用文章中我已经讨论过了 Nlog,在这篇我准备继续和大家讨论一下 NLog 的使用更多高级功能。

接下来看看如何通过 .config 和 代码方式 配置 NLog,使用如何去 轮转日志,使用如何将 Log 对接 database,使用如何使用异步的使用模式提高日志写入性能,同时我还会分享一些 NLog 的使用经验技巧。

安装 NLog

可以通过 NuGet Package Manager 可视化界面 或者 NuGet Package Manager Console 控制台 安装以下包文件。使用

NLog.Web.AspNetCoreNLog.Extensions.LoggingNLog.Config

当你安装完 NLog.Config 之后,源码库使用有一个叫做 NLog.config 文件会自动引用到你的项目中,值得注意的是,NLog.Config 对 NLog 来说不是唯一的,言外之意就是你即可以用 config 模式配置,也可以用 基于代码 的模式配置。

使用 .config 文件配置 NLog

NLog 提供了两种配置方式。

file-based 配置模式 code-based 配置模式

回到刚才的问题,如何采用 file-based 模式,刚才被引入的 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> 

下面的代码展示了如何在 Controller 下用 NLog 记录日志。

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

如果你想通过编程的方式找到当前 NLog 的 target,可使用如下代码:

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 个小时的日志 并且自动删除大于 N 小时的日志,这个特性太实用了,否则的话,你需要经常到生产上去删除日志,下面的代码展示了如何使用 .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">    <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 将日志接入到 database 中,下面的脚本用于创建几张记录日志的表。

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 

数据库连接串和参数属性

接下来如何在 NLog 的 target 中指定数据库连接串,请注意 connectionString 和 commandText 是如何配置的。IT技术网

系统运维
上一篇:华为电脑音响使用教程——打造完美音频体验(掌握华为电脑音响的使用技巧,享受高品质音频效果)
下一篇:课桌电脑置物架的安装教程(简单易懂的步骤让你轻松安装电脑置物架)