首頁

目前文章總數:157 篇

  

最後更新:2024年 12月 07日

0012. Nlog + SQLite微型DB模組化Log記錄方式

日期:2017年 09月 17日

標籤: C# SQLite NLog Asp.NET Framework MVC Web Windows Forms

摘要:ASP.Net MVC 學習筆記


情境:任何應用程式需要輕量化的Log紀錄
基本介紹:本篇介紹基於Web網站的NLog + SQLite3 的方式記錄Log
介紹本篇工具:Nlog是一套紀錄Log的開源(Open Source)工具,通常可以記錄各種應用程式的Log紀錄。
:SQLite為跨平台常見的輕量(檔案小),動態、弱型別的SQL語法的關聯式資料庫

本篇分為3部分
標題 主題
第一部分 一、建立網站 - Nlog 設定 + SQLite的Sql撰寫
第二部分 二、網站的C# 程式
第三部分 三、參考文獻與資料備註

一、建立網站 - Nlog 設定 + SQLite的Sql撰寫


STEP 1: 開啟Visual Studio (本篇使用2015) -> Asp.net應用程式 -> 輸入名稱 -> 確定


STEP 2: 對專案的參考 -> 滑鼠右鍵 -> 選擇管理NuGet套件


STEP 3: 安裝SQLite ,如下畫面,請選擇System.Data.SqLite


STEP 4: 安裝時會將其他的項目一併安裝 -> 請選擇確定


STEP 5: 再接著安裝NLog ,如下畫面


STEP 6: 再接著安裝 NLog.Config ,安裝了這個就不用自己全部重刻一次設定檔。


STEP 7: 安裝完成後,我們的專案就多了NLog.config的設定檔,請打開他


STEP 8: NLog.config這篇我們只會應用到 兩個區塊

區塊 說明
targets 區塊 Log紀錄的方式、寫入的位置
rules 區塊 何種Log等級才要記錄 => 順序: Debug < Info <Warm <Error = Fatal



STEP 9: 請在rules 區塊內貼上以下代碼 ,如下圖顯示,當發生至少要大於warn等級的資料才進行寫入

<logger name="*" minlevel="warn" writeTo="Database_SQLite" />



STEP 10-1: 請在targets 將SQLite3 的代碼插入,如下圖

 <target xsi:type="Database" name="Database_SQLite" keepConnection="false" useTransactions="false">
      <dbProvider>
        System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.105.2, Culture=neutral, PublicKeyToken=db937bc2d44ff139
      </dbProvider>
      <connectionString>
        data source=|DataDirectory|NLog_Record.s3db;
      </connectionString>
      <commandText>

        CREATE TABLE IF NOT EXISTS NLog_Record_${date:format=yyyyMMdd} (sequence_id INTEGER  PRIMARY KEY AUTOINCREMENT
        UNIQUE
        NOT NULL,
        time_stamp  DATETIME NOT NULL,
        level       TEXT     NOT NULL,
        host        TEXT     NOT NULL,
        url         TEXT     NOT NULL,
        type        TEXT     NOT NULL,
        source      TEXT     NOT NULL,
        logger      TEXT     NOT NULL,
        message     TEXT     NOT NULL,
        stacktrace  TEXT     NOT NULL,
        detail      TEXT     NOT NULL);

        insert into NLog_Record_${date:format=yyyyMMdd} (time_stamp, level, host, url, type, source, logger, message, stacktrace, Detail)
        Values(@time_stamp, @level, @host, @url, @type, @source, @logger, @message, @stacktrace, @detail);
      </commandText>
      <parameter name="@time_stamp" layout="${date:format=yyyy-MM-dd HH\:mm\:ss.fff}" />
      <parameter name="@level" layout="${level}" />
      <parameter name="@host" layout="${machinename}" />
      <parameter name="@url" layout="${callsite}" />
      <parameter name="@type" layout="${exception:format=type}" />
      <parameter name="@source" layout="${callsite:className=true}" />
      <parameter name="@logger" layout="${logger}" />
      <parameter name="@message" layout="${message}" />
      <parameter name="@stacktrace" layout="${exception:stacktrace}" />
      <parameter name="@detail" layout="${exception:format=tostring}" />



STEP 10-2: 以下分成4大區塊,解釋說明各執行的工作

區塊 說明
dbProvider區塊 使用的Sqlite的package版本 ※可參考Step10-3
connectionString區塊 紀錄資料的位置
【DataDirector】 =>表示網站的App_Data目錄
NLog_Record.s3db => 表示紀錄於哪個檔案中
CommanText區塊 紀錄資料的位置
【DataDirector】 =>表示網站的App_Data目錄
Insert 部分:如果已經有產生當天的資料表,則將目前的紀錄寫入
Parameter區塊 與CommanText 欄位呼應,將資料依照Nlog 提供的參數寫入,可參考第三部分


STEP 10-3: 點開專案的 pcakage.config ,可以找到對應的SQLite 版本資訊

二、網站的C# 程式


STEP 1: 為了讓網站啟動的時候會自動建立SQLite資料庫,請先回到專案 -> Global.asax ->Global.asax.cs


STEP 2: 撰寫啟動時的執行SQLite3的函式,如下圖:

private void SqliteDBInitinal()
{
            //建立DB
            try
            {
                //Sqlite3DB的建立路徑 - Nlog的路徑
                var nlogSqlitePath = HttpContext.Current.Server.MapPath("~/App_Data/NLog_Record.s3db");
                //
                SQLiteConnection.CreateFile(nlogSqlitePath);
            }
            catch (Exception ex)//當發生錯誤時
            {
                //使用Nlog內建的Error Exception紀錄
                LogManager.GetLogger("MyNlog").ErrorException("建立.s3db時發生例外", ex);
            }
}



STEP 3: 啟動我們的網站 ,可以看到專案的 App_data底下自動建立 NLog_Record.s3db 檔案
但也可以發現,因為目前沒有記錄任何資料所以大小為0


STEP 4: HomeController.cs -> 寫入以下程式碼 ,當開啟網站時,會發生 1. Info事件 (※記錄好人一生平安的資訊) 2.接著會跳到Exception


public ActionResult Index()
{
            try
            {
                LogManager.GetLogger("Action Index").Info("好人一生平安");
                //以下故意將型別設成Null 再塞值,造成Exception
                List<object> testObject = new List<object>();
                testObject = null;
                testObject.Add(null);
            }
            catch (Exception ex)
            {
                LogManager.GetLogger("Action Index").ErrorException("Title:測試發生錯誤", ex);
            }
            return View();
}



STEP 5: 請先安裝 Sqlite 瀏覽工具 ,這邊推薦 SqliteStudio ,有多國語言
https://sqlitestudio.pl/index.rvt


STEP 6: 使用工具開啟NLog_Record.s3db,以下是畫面,請選擇OK即可


STEP 7: 可以看到我們資料表名稱 & 欄位資訊


STEP 8: 選擇數據 -> 可以發現只有一筆 Error紀錄 ,這是因為Info 的級別 小於 warn,所以不會顯示。


STEP 9: 將Nlog.config 的 minLevel 改為 Debug ,如下圖 -> 然後在運行一次網站


STEP 10: 此時就可以看到 Info 的資訊也記錄在 Sqlite3 的Log 紀錄中 。 我們完成Log紀錄模組化的功能了~


三、參考文獻與資料備註


區塊 內容
Nlog 的參數設定 參考連結
檔案提供下載 Github Soruce Code
DevOps講義下載 今天剛好參加2017年的DevOps,以下圖片是擷取講師的ptt 圖片
(※這位講師講得很讚,ptt是開放式下載的,如果有需要可以到https://devopsdays.tw/agenda.html下載)
補充結語 讓Log 紀錄整理清晰就如投影片的重點提示,如果是長遠運行的系統而非拋棄式的系統
能有完整的紀錄可以增加穩定性,在持續完整架構後,最好的回饋是在系統發生問題前可以反饋我們資訊。