成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 架構
NLog 是一個開源的輕量級日志框架,提供了豐富的日志路由和管理功能,同時 NLog 也是非常容易的去配置和擴展,其實在之前的文章中我已經討論過了 Nlog,在這篇我準備繼續和大家討論一下 NLog 的更多高級功能。

[[373358]]

本文轉載自微信公眾號「 碼農讀書」,作者 碼農讀書 。轉載本文請聯系 碼農讀書公眾號。

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. <?xml version="1.0" encoding="utf-8" ?> 
  2. <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4. autoReload="true"
  5.   <extensions> 
  6.     <add assembly="NLog.Web.AspNetCore"/> 
  7.   </extensions> 
  8.   <targets> 
  9.     <target name="logfile" xsi:type="File" fileName="D:\logs\LogMessages-${shortdate}.log" /> 
  10.   </targets> 
  11.   <rules> 
  12.     <logger name="*" minlevel="Trace" writeTo="logfile" /> 
  13.   </rules> 
  14. </nlog> 

下面的代碼展示了如何在 Controller 下用 NLog 記錄日志。

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

如果你想通過編程的方式找到當前 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.  
  12.             var rule = new LoggingRule("*", LogLevel.Debug, dbTarget); 
  13.  
  14.             logConfiguration.LoggingRules.Add(rule); 
  15.             LogManager.Configuration = logConfiguration; 
  16.         } 

配置輪轉日志

你可以讓 NLog 自動實現 輪轉日志,什么叫 輪轉 呢?簡單來說就是:你可以讓 Nlog 只保存近 N 個小時的日志 并且自動刪除大于 N 小時的日志,這個特性太實用了,否則的話,你需要經常到生產上去刪除日志,下面的代碼展示了如何使用 .config 實現自動輪轉日志。

  1. <?xml version="1.0" encoding="utf-8" ?> 
  2. <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4. autoReload="true"
  5.    <targets> 
  6.     <target name="logfile" 
  7.             xsi:type="File" 
  8.             fileName="${basedir}/logs/App.log" 
  9.             layout="${longdate}  ${message}" 
  10.             archiveFileName="${basedir}/logs/archive.{#}.log" 
  11.             archiveEvery="Day" 
  12.             archiveNumbering="Rolling" 
  13.             maxArchiveFiles="7" 
  14.             concurrentWrites="true" 
  15.             keepFileOpen="true" /> 
  16.   </targets> 
  17.   <rules> 
  18.     <logger name="*" minlevel="Info" writeTo="logfile" /> 
  19.   </rules> 
  20. </nlog> 

記錄日志到數據庫

創建數據庫

你可以使用 NLog 將日志接入到 database 中,下面的腳本用于創建幾張記錄日志的表。

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

數據庫連接串和參數屬性

接下來如何在 NLog 的 target 中指定數據庫連接串,請注意 connectionString 和 commandText 是如何配置的。

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

使用參數化

最后,使用 參數化查詢 來防止注入攻擊,詳細代碼如下。

  1. <parameter name="@level" layout="${level}" /> 
  2. <parameter name="@callSite" layout="${callsite}" /> 
  3. <parameter name="@message" layout="${message}" /> 
  4. <parameter name="@additionalInfo" layout="${var:AdditionalInfo}" /> 
  5. <parameter name="@logdatetime" layout="${date:s}" /> 

完整的 NLog

以下是完整的 NLog 文件僅供參考。

  1. <?xml version="1.0" encoding="utf-8" ?> 
  2. <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  4. autoReload="true"
  5.   <extensions> 
  6.     <add assembly="NLog.Web.AspNetCore"/> 
  7.   </extensions> 
  8.   <variable name="AdditionalInfo" value=""/>  
  9.   <targets> 
  10.     <target name="database" xsi:type="Database" keepConnection="true" 
  11.     useTransactions="true" 
  12.     dbProvider="System.Data.SqlClient" 
  13.     connectionString="data source=localhost;initial 
  14.     catalog=NLogDemo;integrated security=false;persist security   
  15.     info=True;User ID=sa;Password=sa1@3#." 
  16.     commandText="INSERT INTO DbLog 
  17.     (level, callsite, message, additionalInfo, logdatetime) 
  18.     Values (@level, @callsite, @message, @additionalInfo, @logdatetime)"> 
  19.       <parameter name="@level" layout="${level}" /> 
  20.       <parameter name="@callSite" layout="${callsite}" /> 
  21.       <parameter name="@message" layout="${message}" /> 
  22.       <parameter name="@additionalInfo" layout="${var:AdditionalInfo}" /> 
  23.       <parameter name="@logdatetime" layout="${date:s}" /> 
  24.     </target>        
  25.   </targets> 
  26.   <rules> 
  27.     <logger levels="Debug,Info,Error,Warn,Fatal" name="databaseLogger" writeTo="database"/> 
  28.   </rules> 
  29. </nlog> 

除了 SQL Server 之外,還可以使用 NLog 將日志記錄到 MySQL,Oracle 和 SQLite 數據庫。

使用 AsyncWrapper 提高性能

NLog 支持多種 targets,比如:AsyncWrapper, BufferingWrapper, FallbackGroup 和 RetryingWrapper,異步的 target 為了提升性能采用 消息的隊列化 并在多個線程中提取隊列消息,下面的代碼展示了如何使用 AsyncWrapper。

  1. <targets> 
  2.   <target xsi:type="AsyncWrapper" 
  3.           name="String" 
  4.           queueLimit="Integer" 
  5.           timeToSleepBetweenBatches="Integer" 
  6.           batchSize="Integer" 
  7.           overflowAction="Enum"
  8.     <target ... /> 
  9.   </target> 
  10. </targets> 

你可以實現 AsyncWrapper 來實現日志記錄的異步化,詳細配置如下:

  1. <targets> 
  2.    <target name="asyncFile" xsi:type="AsyncWrapper"
  3.      <target xsi:type="File" name="fileLog" 
  4.         fileName="${basedir}/Logs/${shortdate}.log" 
  5.            layout="${longdate} ${uppercase:${level}} ${message}"/> 
  6.    </target> 
  7.  </targets> 
  8.  <rules> 
  9.    <logger levels="Debug,Info,Error,Warn,Fatal" writeTo="asyncFile"/> 
  10.  </rules> 

除了這種方式,你還可以在所有的 targets 上用 async=true 直接進行標記為異步化 target,如下配置所示:

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

NLog 的最佳實踐

這一小節列舉了一些使用 NLog 的一些最佳實踐

  • logger 實例應該靜態化,這樣就可以避免在程序中出現多次 logger 初始化帶來的性能開銷。
  • 利用好 NLog 的 Format(當你想結構化日志)支持,避免你自己對 string 的創建和拼接。
  • 指定 throwConfigExceptions="true" ,可以確保當 NLog 配置錯誤的時候有詳細的錯誤信息,例子如下:
  1. <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  3. 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

 

責任編輯:武曉燕 來源: 碼農讀書
相關推薦

2021-03-17 09:45:31

LazyCacheWindows

2021-02-02 16:19:08

Serilog日志框架

2021-02-06 21:40:13

SignalR通訊TypeScript

2021-03-10 09:40:43

LamarASP容器

2021-02-03 13:35:25

ASPweb程序

2021-02-28 20:56:37

NCache緩存框架

2021-03-03 22:37:16

MediatR中介者模式

2021-01-28 22:39:35

LoggerMessa開源框架

2021-01-31 22:56:50

FromServiceASP

2021-01-07 07:39:07

工具接口 Swagger

2021-02-07 17:29:04

監視文件接口

2021-06-22 16:59:56

微軟.NETC# 軟件開發

2021-01-26 14:57:00

中間件應用模塊化

2021-04-12 07:03:10

輕量級模塊化框架

2021-11-02 13:54:41

ElasticSear.NET程序

2017-10-20 08:52:11

內存緩存并發模式Linux

2022-08-01 08:00:00

開發工具跟蹤偵聽器

2021-04-14 07:35:12

Json格式化日期

2009-02-05 14:02:46

SmtpMail發送郵件ASP.NET

2021-11-01 14:52:38

ElasticSear索引SQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线免费观看成人 | 秋霞电影院午夜伦 | 亚洲成人一区 | 久久日韩精品一区二区三区 | 九九综合九九 | 国产96色在线 | 亚洲一区二区免费视频 | 亚洲欧洲成人 | 中文字幕乱码视频32 | 中文字幕亚洲精品 | 免费午夜视频在线观看 | 激情欧美一区二区三区中文字幕 | 亚洲色图综合网 | 欧美亚洲国产一区 | 在线视频日韩精品 | 国产福利视频导航 | 久久国内精品 | 精品国产乱码久久久久久老虎 | 国产清纯白嫩初高生在线播放视频 | 免费成人在线网站 | 中文字幕一区二区三区在线观看 | 国产日韩欧美一区二区 | 在线播放国产一区二区三区 | 国产精品免费一区二区三区四区 | 色视频网站 | 国产三级电影网站 | 亚洲成人精品 | 国产精品午夜电影 | av中文字幕在线观看 | 亚洲国产精品一区二区第一页 | 免费看黄视频网站 | 精品一区二区电影 | 国产一级电影在线 | 亚洲精品久久久9婷婷中文字幕 | 亚洲人成免费 | 久久久久久久网 | 中文字幕1区2区3区 日韩在线视频免费观看 | 日韩 欧美 二区 | 国产 日韩 欧美 在线 | 一区二区国产精品 | 在线视频成人 |