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

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

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

安装 NLog

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

  • NLog.Web.AspNetCore

  • NLog.Extensions.Logging

  • NLog.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 中指定数据库连接串,请注意 connectionStringcommandText 是如何配置的。


<target name="database" xsi:type="Database" keepConnection="true"useTransactions="true"dbProvider="System.Data.SqlClient"connectionString="data source=localhost;initialcatalog=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}" />

完整的 NLog

以下是完整的 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"><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;initialcatalog=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>

除了 SQL Server 之外,还可以使用 NLog 将日志记录到 MySQLOracleSQLite 数据库。

使用 AsyncWrapper 提高性能

NLog 支持多种 targets,比如:AsyncWrapper, BufferingWrapper, FallbackGroup 和 RetryingWrapper,异步的 target 为了提升性能采用 消息的队列化 并在多个线程中提取队列消息,下面的代码展示了如何使用 AsyncWrapper


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

你可以实现 AsyncWrapper 来实现日志记录的异步化,详细配置如下:

<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>

除了这种方式,你还可以在所有的 targets 上用 async=true 直接进行标记为异步化 target,如下配置所示:


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

NLog 的最佳实践

这一小节列举了一些使用 NLog 的一些最佳实践

  • logger 实例应该静态化,这样就可以避免在程序中出现多次 logger 初始化带来的性能开销。

  • 利用好 NLog 的 Format(当你想结构化日志)支持,避免你自己对 string 的创建和拼接。

  • 指定 throwConfigExceptions="true" ,可以确保当 NLog 配置错误的时候有详细的错误信息,例子如下:


<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true" throwConfigExceptions="true">
  • 当记录完日志后,可以调用 LogManager.Shutdown() 来实现数据刷新并且关闭内部所有的线程和定时器。


NLog.LogManager.Shutdown();
  • 不要将 async 属性用在 AsyncWrapper 之上,否则性能会变慢。

  • 慎用 Trace 级别,因为 Trace 会记录所有的日志,考虑使用 Debug 或者 Info 代替。

  • NLog 是轻量级并且快速的,可以使用 asynchronous wrappers 的方式来提升性能。

关于 NLog 还是有太多的话要说,NLog 提供了日志的结构化,方便在大量日志上进行快速过滤和分析,在未来的文章中我会讨论 NLog 的更多高级特性。

译文链接:https://www.infoworld.com/article/3438540/using-advanced-nlog-features-in-aspnet-core.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机模拟分子设计,计算机模拟分子材料.pdf

计算机模拟分子材料.pdf计算机模拟与材料分子设计计算机模拟与材料分子设计CCCCompuomputttterer SiSiSiSimumullllaatititition anon andddd MMMMoollllecuecullllarar DDDDesesiiiigngnDalian Universityof Technology Graduate Course, Lecture 5 2010 AutumnLectureLecture…

python是用来初始化_python的初始化运行了哪些?

下面的3个print一个是在模块下面&#xff0c;一个是函数里面&#xff0c;一个是类名下面(不在方法里面)1、 运行这段代码可以发现第3行和11行可以打印出来。第7行没有打印出来。所以可以放心&#xff0c;函数或者方法里面就算有错误&#xff0c;不调用它是不可能报错的&#xf…

强烈推荐:SiteServer CMS开源免费的企业级CMS系统!

说到CMS&#xff0c;大家都知道织梦、帝国CMS、HPCMS、动易等知名老牌的&#xff01;这些东西也可以拿来就用&#xff0c;上次看到一个个人开源的cms&#xff1a;MCMS。基于SpringBoot 2架构&#xff0c;前端基于vue、element ui。每月28定期更新版本&#xff0c;为开发者提供…

计算机函数公式中怎么合并合并,Excel用函数和公式瞬间实现把表格全部合并到一个表中去...

将多张工作表汇总到一张工作表&#xff0c;这是什么意思呢&#xff1f;可以理解为把表格全部合并到一个表中去&#xff0c;之前使用VBA代码实现&#xff0c;本文将教会大家一种快速的方法&#xff0c;用函数和公式瞬间实现多表合并。例如&#xff1a;有N多个以月份命名的excel工…

permutations python_为什么Python的itertools.permutations包含重复项? (当原始列表重复时)...

为什么Python的itertools.permutations包含重复项&#xff1f; (当原始列表重复时)普遍认为&#xff0c;n个不同符号的列表有n&#xff01; 排列。 但是&#xff0c;当符号不明确时&#xff0c;在math和其他地方最常见的惯例似乎是只计算不同的排列。 因此&#xff0c;列表[1, …

. NET5一出,. NET岗面试普遍喊难,真相是…

.NET高级开发/架构师笔试题TOP101、如何设计一个高并发系统&#xff1f;2、如何实现一个.Net5 IOC框架&#xff1f;3、100W并发4G数据&#xff0c;10W并发400G数据&#xff0c;如何设计Redis存储方式&#xff1f;4、如何实现负载均衡Hash一致性算法&#xff1f;5、DotNetty能够…

计算机所有数据的表示方式都是用,计算机数据表示

1、进制1.1 进制的由来进制&#xff1a;是一种进位的方式。x进制&#xff0c;表示逢x进1。计算机的电子原件的状态&#xff1a;开&#xff0c;关。那么&#xff0c;我们表达数据的时候&#xff0c;也是按照开&#xff0c;关的状态来表示的。如果我们表达数据仅仅使用这两种昨天…

数据库年月日时分秒_数据库基本使用系列(二)

书接上回&#xff0c;上回说到数据库的发展历史&#xff0c;存储引擎以及在库层面的一些操作&#xff0c;这次来讲一下数据库中的一些基本的一些数据格式以及对表的一些操作。数据类型数据库提供的数据类型&#xff0c;包括整数类型、浮点数类型、定点数类型、位类型、日期和时…

C# 9 新特性 —— 增强的模式匹配

C# 9 新特性 —— 增强的模式匹配IntroC# 9 中进一步增强了模式匹配的用法&#xff0c;使得模式匹配更为强大&#xff0c;我们一起来了解一下吧SampleC# 9 中增强了模式匹配的用法&#xff0c;增加了 and/or/not 操作符&#xff0c;而且可以直接判断属性&#xff0c;来看一下下…

arma3自定义服务器,Arma3 生存服架设教程,武装突袭3游戏服务器架设

Arma3 生存服架设教程&#xff0c;武装突袭3游戏服务器架设此教程仅适用于Windows系统&#xff0c;独立服务器或者家用电脑都可以用本教程简单搭设Exile Mod。开服其实很简单, 只要你有足够的耐心&#xff01;1.首先 在你的服务器上打开steam下载ArmA 3 Server (SteamCMD 则使用…

netcore读取json文件_【NET Core】.NET Core中读取json配置文件

在.NET Framework框架下应用配置内容一般都是写在Web.config或者App.config文件中&#xff0c;读取这两个配置文件只需要引用System.Configuration程序集&#xff0c;分别用System.Configuration.ConfigurationManager.AppSettings["SystemName"];//读取appSettings配…

前端数据层落地实践

源宝导读&#xff1a;天际移动平台经过重构改版&#xff0c;近期正式发布了1.0版本&#xff0c;我们在低代码开发方面做了进一步增强。本文主要围绕前端Model、前端业务逻辑(领域模型)、数据层与视图层解耦(包装器模式)3个方面&#xff0c;给大家分享一下统一数据层方案的设计思…

计算机内存条只认了一个,怎么解决Win10插入2个4G内存条却只显示4G?

为了提高 Win10系统 的运行速度&#xff0c;有用户在自己的电脑中&#xff0c;插入了2根4G内存&#xff0c;可是发现电脑只能显示4G而不是8G&#xff0c;奇怪的是使用卤蛋师却可以检测到8G内存&#xff0c;这是怎么回事呢&#xff1f;我们该如何解决呢&#xff1f;下面&#xf…

scanf 返回值_scanf函数

一、函数scanf()是C语言中的一个输入函数。与printf函数一样&#xff0c;都被声明在头文件stdio.h里&#xff0c;因此在使用scanf函数时要加上#include <stdio.h>。它是格式输入函数&#xff0c;即按用户指定的格式从键盘上把数据输入到指定的变量之中。函数的原型为&…

【Git】Git-常用命令备忘录(三)

git作为一个vcs&#xff08;version control system&#xff09;&#xff0c;是越用越香&#xff0c;那么还有哪些比较香的地方呢&#xff01;&#xff1f;1.远程仓库中拉取指定分支一定遇到这种情况&#xff0c;github看到一个心仪的开源仓库&#xff0c;但是分支太多&#xf…

jenkins换服务器找不到包,服务器重启后Jenkins项目部分丢失问题解决方法

UVALive 4670 Dominating Patterns --AC自动机第一题题意:多个模板串,一个文本串,求出那些模板串在文本串中出现次数最多. 解法:AC自动机入门模板题. 代码: #include #include phpMyAdmin - 错误 您应升级到 MySQL 5&period;5&period;0 或更高版本&comma;解决办法。…

mysql表类型_MySQL表类型的选择

P131)创建表时的默认引擎是InnoDB&#xff0c;如果要修改默认的存储引擎&#xff0c;可以在参数文件中设置default-table-type。查看当前的默认存储引擎&#xff0c;可以使用一下命令&#xff1a;创建新表的时候可以通过增加ENGINE关键字设置新建表的存储引擎。也可以通过ALTER…

计算机怎么取消脱敏设置,一种敏感数据自适应的脱敏方法、系统技术方案

【技术实现步骤摘要】一种敏感数据自适应的脱敏方法、系统本专利技术涉及计算机技术与信息安全领域&#xff0c;并且更具体地&#xff0c;涉及一种敏感数据自适应的脱敏方法、系统。技术介绍随着数据时代的到来&#xff0c;数据中蕴藏的巨大价值得以挖掘&#xff0c;同时也带来…

ASP.NET Core Controller与IOC的羁绊

前言看到标题可能大家会有所疑问Controller和IOC能有啥羁绊&#xff0c;但是我还是拒绝当一个标题党的。相信有很大一部分人已经知道了这么一个结论&#xff0c;默认情况下ASP.NET Core的Controller并不会托管到IOC容器中&#xff0c;注意关键字我说的是"默认"&#…

win10 mysql my.cnf_MySQL配置文件无法修改的解决方法(Win10)

帮别人解决的问题&#xff0c;记录一下。问题描述MySQL的版本是5.7&#xff0c;操作系统是window10。MySQL安装在 C:\Program Files 下。最近需要在MySQL安装目录下的 my-default.ini 配置文件里面加上一个新的配置项&#xff1a;max_allowed_packet100M编辑文件后保存&#xf…