1. 程式人生 > >從零開始搭建前後端分離的NetCore2.2(EF Core CodeFirst+Autofac)+Vue的專案框架之四Nlog記錄日誌至資料庫

從零開始搭建前後端分離的NetCore2.2(EF Core CodeFirst+Autofac)+Vue的專案框架之四Nlog記錄日誌至資料庫

  為什麼要進行日誌記錄呢?為什麼要存至資料庫呢?只能說日誌記錄是每個系統都應當有的。

  好的日誌記錄方式可以提供我們足夠多定位問題的依據。查詢系統或軟體或專案的錯誤或異常記錄。程式在執行時就像一個機器人,我們可以從所記錄的日誌看出它正在做什麼,是不是按預期的設計在做,用來判斷執行狀態是否是正常的。

  日誌中包括主機名、時間、日誌級別、日誌訊息、異常明細、異常型別。

  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();
        }

然後啟動專案,訪問剛剛那個介面地址,就可以看到日誌表中已經新增進去這幾個日誌了。

到這裡也就完成了日誌記錄到資料的操作了。

 

  在下一篇中將介紹如何使用過濾器來進行全域性異常處理,處理那些未處理的異常或自定義丟擲的異常。

 

  有需要原始碼的在下方評論或私信~給我的SVN訪客賬戶密碼下載,程式碼未放在GitHub