十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問題一站解決
本篇文章給大家分享的是有關(guān)怎么在Asp.Net Core中使用NLog記錄日志,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

需求
1.日志自動(dòng)寫入到數(shù)據(jù)庫(kù)、寫入到文件
2.appsettings.json數(shù)據(jù)庫(kù)連接更改后,不需要去改NLog中的連接地址,啟動(dòng)網(wǎng)站或項(xiàng)目時(shí)自動(dòng)檢測(cè)變動(dòng)然后去更改,以appsettings.json為準(zhǔn),保持同步。
3.寫入日志時(shí),除了NLog自帶的字段,新增LogType自定義字段記錄日志類型,例如網(wǎng)站日志、中間件日志等
4.統(tǒng)一的寫日志方法,不用每次get一個(gè)logger對(duì)象(或依賴注入)來記日志
安裝包
在nuget中安裝NLog和NLog.Web.AspNetCore ,這兩個(gè)是NLog相關(guān)的包。
還需要安裝NLog寫入數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)適配器,我這里寫入到MySQL數(shù)據(jù)庫(kù),所以安裝MySql.Data
如果是寫入到SQL server數(shù)據(jù)庫(kù),需要安裝Microsoft.Data.SqlClient

NLog.config 配置文件內(nèi)容
網(wǎng)站根目錄下新建NLog.config配置文件,記得右擊該文件“屬性”,復(fù)制到輸出目錄:“始終復(fù)制”
NLog.config文件內(nèi)容:
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);
配置文件解讀 nlog根節(jié)點(diǎn): autoReload屬性,true時(shí),如果NLog.config文件有變動(dòng),會(huì)自動(dòng)應(yīng)用新配置(但是會(huì)有延遲,過幾秒才會(huì)應(yīng)用起來) internalLogLevel屬性,設(shè)定后,輸出的是NLog內(nèi)部自己的日志記錄,如果遇到NLog異常/配置文件沒配好,可以把Off改為Trace或Debug來查看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",就是寫入數(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ǔ)句,可以看到我這里是寫入到TblLogrecords表,表結(jié)構(gòu)下文會(huì)展示出來 parameter子節(jié)點(diǎn)是insert語(yǔ)句的各個(gè)參數(shù): 有個(gè)name="@LogType"參數(shù),layout="${event-properties:item=LogType}",表示@LogType參數(shù)的值從event-properties中的LogType中取,這個(gè)后文會(huì)寫到用法其余參數(shù)均是NLog自帶的內(nèi)容,aspnet-開頭的是NLog.Web.AspNetCore包中提供的方法 layout render官方文檔 第二個(gè)target節(jié)點(diǎn),可以看到name是log_file,這里的name和下方logger中writeTo屬性對(duì)應(yīng) xsi:type="File",即寫入到文件 fileName屬性是文件名,這里是寫入到當(dāng)前目錄下的logs文件夾,并且按日期歸檔 layout屬性是寫入日志的格式 rules節(jié)點(diǎn)是各個(gè)日志記錄器logger的配置 第一個(gè)logger配置跳過所有Microsoft組件的日志記錄,final 標(biāo)記當(dāng)前規(guī)則為最后一個(gè)規(guī)則。其后的規(guī)則即時(shí)匹配也不會(huì)被運(yùn)行。第二個(gè)logger name="logdb",該日志記錄器名為logdb,是適配log_database規(guī)則,即寫入數(shù)據(jù)庫(kù),如果要適配多條規(guī)則,用逗號(hào)隔開其余規(guī)則可以參考https://www.jb51.net/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");
///
/// 寫日志到數(shù)據(jù)庫(kù)
///
/// 日志等級(jí)
/// 日志類型
/// 信息
/// 異常
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);
}
///
/// 寫日志到文件
///
/// 日志等級(jí)
/// 日志類型
/// 信息
/// 異常
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);
}
///
/// 確保NLog配置文件sql連接字符串正確
///
///
///
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í)沒有考慮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();
//獲取到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寫到本地日志文件(萬(wàn)一數(shù)據(jù)庫(kù)沒創(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ù)和文件:

ASP.NET 是開源,跨平臺(tái),高性能,輕量級(jí)的 Web 應(yīng)用構(gòu)建框架,常用于通過 HTML、CSS、JavaScript 以及服務(wù)器腳本來構(gòu)建網(wǎng)頁(yè)和網(wǎng)站。
以上就是怎么在Asp.Net Core中使用NLog記錄日志,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。