如何在ASP.NETCore中使用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 内容如下:

 
 
 
  1. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. autoReload="true">
  3.   
  4.     
  5.   
  6.   
  7.     
  8.   
  9.   
  10.     
  11.   

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

 
 
 
  1. public class HomeController : Controller
  2.  {
  3.      Logger _logger = (Logger)LogManager.GetCurrentClassLogger(typeof(Logger));  
  4.      public IActionResult Index()
  5.       {
  6.          _logger.Info("Application started");       
  7.           return View();
  8.       }
  9.     //Other action methods
  10.   }

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

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

使用 代码配置 NLog

同样你也可以使用编码的形式配置 NLog,只需要调用 NLog 提供的 API 接口即可,下面的代码展示了如何配置 Nlog。

 
 
 
  1. private static void ConfigureNLog()
  2.         {
  3.             var logConfiguration = new LoggingConfiguration();
  4.             
  5.             var dbTarget = new DatabaseTarget();
  6.             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)";
  7.             dbTarget.Parameters.Add(new DatabaseParameterInfo("@level", "${level}"));
  8.             dbTarget.Parameters.Add(new DatabaseParameterInfo("@callSite", "${callSite}"));
  9.             dbTarget.Parameters.Add(new DatabaseParameterInfo("@message", "${message}"));
  10.             dbTarget.Parameters.Add(new DatabaseParameterInfo("@logdatetime","${date:s}"));
  11.             var rule = new LoggingRule("*", LogLevel.Debug, dbTarget);
  12.             logConfiguration.LoggingRules.Add(rule);
  13.             LogManager.Configuration = logConfiguration;
  14.         }

配置轮转日志

你可以让 NLog 自动实现 轮转日志,什么叫 轮转 呢?简单来说就是:你可以让 Nlog 只保存近 N 个小时的日志 并且自动删除大于 N 小时的日志,这个特性太实用了,否则的话,你需要经常到生产上去删除日志,下面的代码展示了如何使用 .config 实现自动轮转日志。

 
 
 
  1. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. autoReload="true">
  3.    
  4.     
  5.             xsi:type="File"
  6.             fileName="${basedir}/logs/App.log"
  7.             layout="${longdate}  ${message}"
  8.             archiveFileName="${basedir}/logs/archive.{#}.log"
  9.             archiveEvery="Day"
  10.             archiveNumbering="Rolling"
  11.             maxArchiveFiles="7"
  12.             concurrentWrites="true"
  13.             keepFileOpen="true" />
  14.   
  15.   
  16.     
  17.   

记录日志到数据库

创建数据库

你可以使用 NLog 将日志接入到 database 中,下面的脚本用于创建几张记录日志的表。

 
 
 
  1. CREATE TABLE [dbo].[DbLog](
  2.       [Id] [int] IDENTITY(1,1) NOT NULL,
  3.       [Level] [varchar](max) NULL,
  4.       [CallSite] [varchar](max) NULL,
  5.       [Message] [varchar](max) NULL,
  6.       [AdditionalInfo] [varchar](max) NULL,
  7.       [LogDateTime] [datetime] NOT NULL,
  8.  CONSTRAINT [PK_DbLogs] PRIMARY KEY CLUSTERED
  9. (
  10.       [Id] ASC
  11. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  12. ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
  13. GO

数据库连接串和参数属性

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

 
 
 
  1.  useTransactions="true"
  2.  dbProvider="System.Data.SqlClient"
  3.  connectionString="data source=localhost;initial
  4.  catalog=NLogDemo;integrated security=false;
  5.  persist security info=True;User ID=sa;Password=sa1@3#."
  6.  commandText="INSERT INTO DbLog (level, callsite, message, additionalInfo,
  7.  logdatetime) Values (@level, @callsite, @message, @additionalInfo,
  8.  @logdatetime)">

使用参数化

最后,使用 参数化查询 来防止注入攻击,详细代码如下。

 
 
 

完整的 NLog

以下是完整的 NLog 文件仅供参考。

 
 
 
  1. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. autoReload="true">
  3.   
  4.     
  5.   
  6.    
  7.   
  8.     
  9.     useTransactions="true"
  10.     dbProvider="System.Data.SqlClient"
  11.     connectionString="data source=localhost;initial
  12.     catalog=NLogDemo;integrated security=false;persist security  
  13.     info=True;User ID=sa;Password=sa1@3#."
  14.     commandText="INSERT INTO DbLog
  15.     (level, callsite, message, additionalInfo, logdatetime)
  16.     Values (@level, @callsite, @message, @additionalInfo, @logdatetime)">
  17.       
  18.       
  19.       
  20.       
  21.       
  22.            
  23.   
  24.   
  25.     
  26.   

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

使用 AsyncWrapper 提高性能

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

 
 
 
  1.   
  2.           name="String"
  3.           queueLimit="Integer"
  4.           timeToSleepBetweenBatches="Integer"
  5.           batchSize="Integer"
  6.           overflowAction="Enum">
  7.     
  8.   

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

 
 
 
  1.    
  2.      
  3.         fileName="${basedir}/Logs/${shortdate}.log"
  4.            layout="${longdate} ${uppercase:${level}} ${message}"/>
  5.    
  6.  
  7.  
  8.    
  9.  

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

 
 
 
  1.   ... Write your targets here ...

NLog 的最佳实践

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

  • logger 实例应该静态化,这样就可以避免在程序中出现多次 logger 初始化带来的性能开销。
  • 利用好 NLog 的 Format(当你想结构化日志)支持,避免你自己对 string 的创建和拼接。
  • 指定 throwConfigExceptions="true" ,可以确保当 NLog 配置错误的时候有详细的错误信息,例子如下:
 
 
 
  1. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. autoReload="true" throwConfigExceptions="true">
  • 当记录完日志后,可以调用 LogManager.Shutdown() 来实现数据刷新并且关闭内部所有的线程和定时器。
 
 
 
  1. 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

网页名称:如何在ASP.NETCore中使用NLog的高级特性
转载来源:http://www.shufengxianlan.com/qtweb/news18/109268.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联