為什么要進行日志記錄呢?為什么要存至數據庫呢?只能說日志記錄是每個系統都應當有的。
好的日志記錄方式可以提供我們足夠多定位問題的依據。查找系統或軟件或項目的錯誤或異常記錄。程序在運行時就像一個機器人,我們可以從所記錄的日志看出它正在做什么,是不是按預期的設計在做,用來判斷運行狀態是否是正常的。
日志中包括主機名、時間、日志級別、日志消息、異常明細、異常類型。
NetCore在包含 Startup 的項目上使用Nuget包管理工具添加 NLog.Web.AspNetCore 依賴,然后添加 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"> <targets> <target xsi:type="Database" name="database" connectionString="Data Source=.;Initial Catalog=LogServer;User ID=sa;Password=123456;" commandText="insert into TestLog ([LogTime], [LogLevel], [Message], [Host],[ExpType],[MethodName],[ExDetail]) values (@LogTime,@LogLevel, @Message, @Host,@ExpType,@MethodName,@ExDetail) ;"> <parameter name="@Host" layout="${machinename}" /> <parameter name="@LogTime" layout="${longdate}"/><!--日志發生時間--> <parameter name="@LogLevel" layout="${level}"/><!--日志等級--> <parameter name="@Message" layout="${message}"/><!--日志信息--> <parameter name="@MethodName" layout="${callsite:methodName=true}" /> <parameter name="@ExpType" layout="${exception:format=type}" /> <parameter name="@ExDetail" layout="${exception:format=tostring}" /> </target> </targets> <rules> <logger name="*" level="Fatal" writeTo="database"/> <logger name="*" level="Warn" writeTo="database"/> <logger name="*" level="Debug" writeTo="database"/> <logger name="*" level="Error" writeTo="database"/> <logger name="*" level="Info" writeTo="database"/> <logger name="*" level="Trace" writeTo="database"/> </rules> </nlog>
當中的 LogServer 是數據庫名,TestLog 是表名。
然后再去數據庫創建相對應的庫與表,建表語句:
CREATE TABLE TestLog( [Id] [bigint] IDENTITY(1,1) NOT NULL, [Host] [varchar](350) NULL, [LogTime] [varchar](350) NULL, [LogLevel] [varchar](350) NULL, [Message] [varchar](max) NULL, [MethodName] [varchar](350) NULL, [ExpType] [varchar](350) NULL, [ExDetail] [varchar](max) NULL, CONSTRAINT [PK_TestLog] 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]
然后在 Startup 的 構造函數中更改如下:在構造函數中添加 IHostingEnvironment env
然后 env.ConfigureNLog("NLog.config");
public Startup(IConfiguration configuration, IHostingEnvironment env) { env.ConfigureNLog("NLog.config"); Configuration = configuration; }
然后在要添加 LogHelper 類的項目上使用Nuget包管理工具添加 NLog 依賴LogHelper 代碼如下:
/// <summary> /// 日志記錄類; /// 嚴重級別從小到大:Trace、Debug、Info、Warn、Error、Fatal /// </summary> public class LogHelper { /// <summary> /// NLog的實例對象 /// </summary> public static NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); }
在項目自帶的 ValuesController 中添加一個測試寫日志的方法
[HttpGet] [Route("log")] public ActionResult TestLog() { LogHelper.Logger.Trace("測試日志"); LogHelper.Logger.Debug("測試日志"); LogHelper.Logger.Info("測試日志"); LogHelper.Logger.Warn("測試日志"); LogHelper.Logger.Error("測試日志"); LogHelper.Logger.Fatal("測試日志"); return Succeed(); }
然后啟動項目,訪問剛剛那個接口地址,就可以看到日志表中已經添加進去這幾個日志了。
到這里也就完成了日志記錄到數據的操作了。
在下一篇中將介紹如何使用過濾器來進行全局異常處理,處理那些未處理的異常或自定義拋出的異常。
有需要源碼的可通過此 GitHub 鏈接拉取 覺得還可以的給個 start 哦,謝謝!