亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Asp.Net Core用NLog記錄日志操作方法

 更新時(shí)間:2019年10月28日 17:08:33   作者:yzh  
在本篇文章里小編給大家整理的是一篇關(guān)于Asp.Net Core用NLog記錄日志操作方法以及相關(guān)知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)下。

需求

1.日志自動(dòng)寫(xiě)入到數(shù)據(jù)庫(kù)、寫(xiě)入到文件

2.appsettings.json數(shù)據(jù)庫(kù)連接更改后,不需要去改NLog中的連接地址,啟動(dòng)網(wǎng)站或項(xiàng)目時(shí)自動(dòng)檢測(cè)變動(dòng)然后去更改,以appsettings.json為準(zhǔn),保持同步。

3.寫(xiě)入日志時(shí),除了NLog自帶的字段,新增LogType自定義字段記錄日志類型,例如網(wǎng)站日志、中間件日志等

4.統(tǒng)一的寫(xiě)日志方法,不用每次get一個(gè)logger對(duì)象(或依賴注入)來(lái)記日志

安裝包

在nuget中安裝NLogNLog.Web.AspNetCore ,這兩個(gè)是NLog相關(guān)的包。

還需要安裝NLog寫(xiě)入數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)適配器,我這里寫(xiě)入到MySQL數(shù)據(jù)庫(kù),所以安裝MySql.Data

如果是寫(xiě)入到SQL server數(shù)據(jù)庫(kù),需要安裝Microsoft.Data.SqlClient

NLog.config 配置文件內(nèi)容

網(wǎng)站根目錄下新建NLog.config配置文件,記得右擊該文件“屬性”,復(fù)制到輸出目錄:“始終復(fù)制”

NLog.config文件內(nèi)容:

<?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" 
 throwExceptions="false" 
 internalLogLevel="Off" 
 internalLogFile="NlogRecords.log">
 <!--Nlog內(nèi)部日志記錄為Off關(guān)閉。除非糾錯(cuò),不可以設(shè)為Trace否則速度很慢,起碼Debug以上-->
 <extensions>
 <add assembly="NLog.Web.AspNetCore" />
 </extensions>
 <targets>
 <!--通過(guò)數(shù)據(jù)庫(kù)記錄日志 配置
 dbProvider請(qǐng)選擇mysql或是sqlserver,同時(shí)注意連接字符串,需要安裝對(duì)應(yīng)的sql數(shù)據(jù)提供程序
 MYSQL:
 dbProvider="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"
 connectionString="server=localhost;database=BaseMIS;user=root;password=123456"
 MSSQL:
 dbProvider="Microsoft.Data.SqlClient"
 connectionString="Server=127.0.0.1;Database=BaseMIS;User ID=sa;Password=123456"
 -->
 <target name="log_database" xsi:type="Database" dbProvider="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"
  connectionString="server=192.168.137.10;database=TestNLog;user=root;password=mysql@local">
 <commandText>
 INSERT INTO TblLogrecords 
 (LogDate,LogLevel,LogType,Logger,Message,MachineName,MachineIp,NetRequestMethod
 ,NetRequestUrl,NetUserIsauthenticated,NetUserAuthtype,NetUserIdentity,Exception)
 VALUES
 (@LogDate,@LogLevel,@LogType,@Logger,@Message,@MachineName,@MachineIp,@NetRequestMethod
 ,@NetRequestUrl,@NetUserIsauthenticated,@NetUserAuthtype,@NetUserIdentity,@Exception);
 </commandText>
 <parameter name="@LogDate" layout="${date}" />
 <parameter name="@LogLevel" layout="${level}" />
 <parameter name="@LogType" layout="${event-properties:item=LogType}" />
 <parameter name="@Logger" layout="${logger}" />
 <parameter name="@Message" layout="${message}" />
 <parameter name="@MachineName" layout="${machinename}" />
 <parameter name="@MachineIp" layout="${aspnet-request-ip}" />
 <parameter name="@NetRequestMethod" layout="${aspnet-request-method}" />
 <parameter name="@NetRequestUrl" layout="${aspnet-request-url}" />
 <parameter name="@NetUserIsauthenticated" layout="${aspnet-user-isauthenticated}" />
 <parameter name="@NetUserAuthtype" layout="${aspnet-user-authtype}" />
 <parameter name="@NetUserIdentity" layout="${aspnet-user-identity}" />
 <parameter name="@Exception" layout="${exception:tostring}" />
 </target>
 <target name="log_file" xsi:type="File" fileName="${basedir}/logs/${shortdate}.log" 
  layout="${longdate} | ${level:uppercase=false} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}" />
 </targets>
 <rules>
 <!--跳過(guò)所有級(jí)別的Microsoft組件的日志記錄-->
 <logger name="Microsoft.*" final="true" />
 <!-- BlackHole without writeTo -->
 <!--只通過(guò)數(shù)據(jù)庫(kù)記錄日志,如果給了name名字,cs里用日志記錄的時(shí)候,取logger需要把name當(dāng)做參數(shù)-->
 <logger name="logdb" writeTo="log_database" />
 <logger name="logfile" writeTo="log_file" />
 </rules>
</nlog>

配置文件解讀 nlog根節(jié)點(diǎn): autoReload屬性,true時(shí),如果NLog.config文件有變動(dòng),會(huì)自動(dòng)應(yīng)用新配置(但是會(huì)有延遲,過(guò)幾秒才會(huì)應(yīng)用起來(lái)) internalLogLevel屬性,設(shè)定后,輸出的是NLog內(nèi)部自己的日志記錄,如果遇到NLog異常/配置文件沒(méi)配好,可以把Off改為Trace或Debug來(lái)查看NlogRecords.log里的內(nèi)容 internalLogFile屬性,可以設(shè)定路徑,例如默認(rèn)的c:\temp\nlog-internal.log 新增了extensions節(jié)點(diǎn),因?yàn)橐昧?code>NLog.Web.AspNetCore包 targets節(jié)點(diǎn)中是各種記錄方式的配置第一個(gè)target節(jié)點(diǎn),可以看到name是log_database,這里的name和下方logger中writeTo屬性對(duì)應(yīng) xsi:type="Database",就是寫(xiě)入數(shù)據(jù)庫(kù)了 dbProvider屬性是數(shù)據(jù)庫(kù)適配器,MySQL是MySql.Data.MySqlClient.MySqlConnection, MySql.Data,SQL server是Microsoft.Data.SqlClient,其他數(shù)據(jù)庫(kù)適配器可在官方文檔內(nèi)查看 connectionString即連接字符串了 commandText子節(jié)點(diǎn)是插入數(shù)據(jù)庫(kù)時(shí)insert語(yǔ)句,可以看到我這里是寫(xiě)入到TblLogrecords表,表結(jié)構(gòu)下文會(huì)展示出來(lái) parameter子節(jié)點(diǎn)是insert語(yǔ)句的各個(gè)參數(shù): 有個(gè)name="@LogType"參數(shù),layout="${event-properties:item=LogType}",表示@LogType參數(shù)的值從event-properties中的LogType中取,這個(gè)后文會(huì)寫(xiě)到用法其余參數(shù)均是NLog自帶的內(nèi)容,aspnet-開(kāi)頭的是NLog.Web.AspNetCore包中提供的方法 layout render官方文檔 第二個(gè)target節(jié)點(diǎn),可以看到name是log_file,這里的name和下方logger中writeTo屬性對(duì)應(yīng) xsi:type="File",即寫(xiě)入到文件 fileName屬性是文件名,這里是寫(xiě)入到當(dāng)前目錄下的logs文件夾,并且按日期歸檔 layout屬性是寫(xiě)入日志的格式 rules節(jié)點(diǎn)是各個(gè)日志記錄器logger的配置 第一個(gè)logger配置跳過(guò)所有Microsoft組件的日志記錄,final 標(biāo)記當(dāng)前規(guī)則為最后一個(gè)規(guī)則。其后的規(guī)則即時(shí)匹配也不會(huì)被運(yùn)行。第二個(gè)logger name="logdb",該日志記錄器名為logdb,是適配log_database規(guī)則,即寫(xiě)入數(shù)據(jù)庫(kù),如果要適配多條規(guī)則,用逗號(hào)隔開(kāi)其余規(guī)則可以參考http://chabaoo.cn/article/173004.htm  數(shù)據(jù)庫(kù)配置數(shù)據(jù)表結(jié)構(gòu)

這里數(shù)據(jù)庫(kù)為TestNLog:

CREATE DATABASE IF NOT EXISTS `TestNLog`;
USE `TestNLog`;

-- Dumping structure for table TestNLog.TblLogrecords
CREATE TABLE IF NOT EXISTS `TblLogrecords` (
 `Id` int(11) NOT NULL AUTO_INCREMENT,
 `LogDate` datetime(6) NOT NULL,
 `LogLevel` varchar(50) NOT NULL,
 `LogType` varchar(50) DEFAULT NULL,
 `Logger` varchar(256) NOT NULL,
 `Message` longtext,
 `MachineName` varchar(50) DEFAULT NULL,
 `MachineIp` varchar(50) DEFAULT NULL,
 `NetRequestMethod` varchar(10) DEFAULT NULL,
 `NetRequestUrl` varchar(500) DEFAULT NULL,
 `NetUserIsauthenticated` varchar(10) DEFAULT NULL,
 `NetUserAuthtype` varchar(50) DEFAULT NULL,
 `NetUserIdentity` varchar(50) DEFAULT NULL,
 `Exception` longtext,
 PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=96 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

網(wǎng)站配置連接

appsettings.json中增加ConectionStrings節(jié)點(diǎn):

"ConectionStrings": {
 "MySqlConnection": "server=192.168.137.10;database=TestNLog;user=root;password=mysql@local"
 }

統(tǒng)一日志記錄方法

網(wǎng)站下新建CommonUtils文件夾,添加NLogUtil.cs文件(包含LogType定義):

using NLog;
using NLog.Config;
using System;
using System.ComponentModel;
using System.Linq;
using System.Xml.Linq;

namespace NLogUsage.CommonUtils
{
 public enum LogType
 {
 [Description("網(wǎng)站")]
 Web,
 [Description("數(shù)據(jù)庫(kù)")]
 DataBase,
 [Description("Api接口")]
 ApiRequest,
 [Description("中間件")]
 Middleware
 }
 public static class NLogUtil
 {
 public static Logger dbLogger = LogManager.GetLogger("logdb");
 public static Logger fileLogger = LogManager.GetLogger("logfile");
 /// <summary>
 /// 寫(xiě)日志到數(shù)據(jù)庫(kù)
 /// </summary>
 /// <param name="logLevel">日志等級(jí)</param>
 /// <param name="logType">日志類型</param>
 /// <param name="message">信息</param>
 /// <param name="exception">異常</param>
 public static void WriteDBLog(LogLevel logLevel, LogType logType, string message, Exception exception = null)
 {
  LogEventInfo theEvent = new LogEventInfo(logLevel, dbLogger.Name, message);
  theEvent.Properties["LogType"] = logType.ToString();
  theEvent.Exception = exception;
  dbLogger.Log(theEvent);
 }
 /// <summary>
 /// 寫(xiě)日志到文件
 /// </summary>
 /// <param name="logLevel">日志等級(jí)</param>
 /// <param name="logType">日志類型</param>
 /// <param name="message">信息</param>
 /// <param name="exception">異常</param>
 public static void WriteFileLog(LogLevel logLevel, LogType logType, string message, Exception exception = null)
 {
  LogEventInfo theEvent = new LogEventInfo(logLevel, fileLogger.Name, message);
  theEvent.Properties["LogType"] = logType.ToString();
  theEvent.Exception = exception;
  fileLogger.Log(theEvent);
 }

 /// <summary>
 /// 確保NLog配置文件sql連接字符串正確
 /// </summary>
 /// <param name="nlogPath"></param>
 /// <param name="sqlConnectionStr"></param>
 public static void EnsureNlogConfig(string nlogPath, string sqlConnectionStr)
 {
  XDocument xd = XDocument.Load(nlogPath);
  if (xd.Root.Elements().FirstOrDefault(a => a.Name.LocalName == "targets")
  is XElement targetsNode && targetsNode != null &&
  targetsNode.Elements().FirstOrDefault(a => a.Name.LocalName == "target" && a.Attribute("name").Value == "log_database")
  is XElement targetNode && targetNode != null)
  {
  if (!targetNode.Attribute("connectionString").Value.Equals(sqlConnectionStr))//不一致則修改
  {
   //這里暫時(shí)沒(méi)有考慮dbProvider的變動(dòng)
   targetNode.Attribute("connectionString").Value = sqlConnectionStr;
   xd.Save(nlogPath);
   //編輯后重新載入配置文件(不依靠NLog自己的autoReload,有延遲)
   LogManager.Configuration = new XmlLoggingConfiguration(nlogPath);
  }
  }
 }
 }
}

配置NLog依賴注入

網(wǎng)站Program.cs文件中,在CreateHostBuilder方法中添加以下內(nèi)容:

//using NLog.Web;
.ConfigureLogging(logging => { 
  logging.ClearProviders(); 
  logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); 
  }).UseNLog(); // NLog: 依賴注入Nlog

完成后如下圖所示:

啟動(dòng)項(xiàng)目同步連接字符串

修改網(wǎng)站啟動(dòng)Program.cs中的邏輯:

//using NLogUsage.CommonUtils;
//using Microsoft.Extensions.DependencyInjection;
public static void Main(string[] args)
{
 //CreateHostBuilder(args).Build().Run();
 var host = CreateHostBuilder(args).Build();
 try
 {
 using (IServiceScope scope = host.Services.CreateScope())
 {
  IConfiguration configuration = scope.ServiceProvider.GetRequiredService<IConfiguration>();
  //獲取到appsettings.json中的連接字符串
  string sqlString = configuration.GetSection("ConectionStrings:MySqlConnection").Value;
  //確保NLog.config中連接字符串與appsettings.json中同步
  NLogUtil.EnsureNlogConfig("NLog.config", sqlString);
 }
 //throw new Exception("測(cè)試異常");//for test

 //其他項(xiàng)目啟動(dòng)時(shí)需要做的事情
 //code
 NLogUtil.WriteDBLog(NLog.LogLevel.Trace, LogType.Web, "網(wǎng)站啟動(dòng)成功");
 host.Run();
 }
 catch (Exception ex)
 {
 //使用nlog寫(xiě)到本地日志文件(萬(wàn)一數(shù)據(jù)庫(kù)沒(méi)創(chuàng)建/連接成功)
 string errorMessage = "網(wǎng)站啟動(dòng)初始化數(shù)據(jù)異常";
 NLogUtil.WriteFileLog(NLog.LogLevel.Error, LogType.Web, errorMessage, new Exception(errorMessage, ex));
 NLogUtil.WriteDBLog(NLog.LogLevel.Error, LogType.Web, errorMessage, new Exception(errorMessage, ex));
 throw;
 }
}

修改完成后,如下圖所示:

啟動(dòng)驗(yàn)證

啟動(dòng)項(xiàng)目,可以正常記錄日志到數(shù)據(jù)庫(kù)和文件:

以上就是本次介紹的全部相關(guān)知識(shí)點(diǎn),感謝大家的學(xué)習(xí)和對(duì)腳本之家的支持。

相關(guān)文章

最新評(píng)論