Log2Net日誌查詢網站程式碼解析

三河散人發表於2019-07-08

   在前面的幾節中,我們介紹了Log2Net的使用方法和程式碼設計。使用這個元件,我們可以方便地將日誌記錄到資料庫中,那麼,我們怎麼能看到這些日誌呢?於是,日誌查詢網站應運而生。效果圖如下: 

 

  該程式碼已開源,地址為 https://github.com/yuchen1030/Log2Net-LgWG.LogQuery 。下面介紹其程式碼設計。

一、總體介紹

  日誌查詢網站由三部分組成:1、系統監控;2、日誌查詢;3、許可權設計。本系統對應的資料庫為讀寫分離中的讀,使用的資料庫為LogTrace_R、LogMonitor_R以及LogQuery,專案名稱為LgWG.LogQuery。LgWG意為Log2Net Work Group。

  本網站採用ABP框架,需要對以下知識有所瞭解:ASP.NET MVC 5、Web API 2、DDD領域驅動設計 (Entities、Repositories、Domain Services、Domain Events、Application Services、DTOs等)、Ioc/DI、Castle windsor (依賴注入容器)、Entity Framework 6、資料遷移、AutoMapper(實現Dto類與實體類的雙向自動轉換)、SignalR、Bootstrap 、jQuery等。參考網站:http://www.aspnetboilerplate.com/ 。

  使用該框架進行開發時,第一步是從ABP官網http://www.aspnetboilerplate.com/Templates上下載模板,例如本專案起名為LgWG.LogQuery,則下載的模板如下圖所示:

   該專案需要使用VS2017開啟,.net版本為4.6.1,對Nuget的版本要求等請按照提示進行相應安裝。還原程式包後,將web專案設為起始專案,在程式包管理器控制檯下選擇EF專案,執行Update-Database命令,系統會自動為我們建立預設的資料庫。然後執行專案就可以得到一個直接執行的網站,可以進行許可權管理(租戶管理、角色管理、使用者管理)等。我們在此基礎上新增我們的業務功能實現日誌查詢。

  本網站分為公共方法/工具類、基礎設施層、領域層、應用服務層、網站應用層,許可權部分的設計ABP已經為我們實現好了,我們需要做的工作是實現監控日誌LogMonitor和操作軌跡日誌LogTrace這兩個領域的實現和應用。

 二、領域核心層和基礎設施層 

  ABP框架中,官方推薦使用code first,即先寫領域核心層實體,建立資料庫遷移,然後生成資料庫。對於LogQuery資料庫,確實是這樣的(對此資料庫的實體,ABP已經為我們做好了,我們只需要upodate資料庫即可)。然而對於LogTrace_R和LogMonitor_R資料庫,他們已經存在了,我們採用Code first from database的方式來生成實體和資料庫上下文。具體做法是在EF專案下新增ADO.NET實體資料模型,然後選擇Code first from database,選擇資料庫連線之後就會建立實體模型,然後我們將這裡生成的實體剪下到core專案下,即完成了core層的實體建立工作。

  LgWG.LogQuery.Core層定義系統的領域,即定義系統使用的實體,定義倉儲介面等。本專案定義了LogTrace和LogMonitor兩個領域,分別定義了其實體和倉儲介面。我們定義了泛型的基礎倉儲介面IBaseRepository,這兩個倉儲介面繼承之。
  LgWG.LogQuery.EntityFramework層為倉儲實現,我們分別定義這兩個實體介面的實現。一般情況下,我們只需要繼承EfRepositoryBase就可以了,EfRepositoryBase已經為我們定義了常見的增刪改查方法的實現,只有對一些特殊的方法才需要我們自己來實現。

三、應用服務層

  本層(LgWG.LogQuery.Application)呼叫核心層的介面,對UI層提供服務。在本層中,DTO資料傳輸物件的主要作用是封裝UI層需要的資料,避免資料庫實體全部暴露給UI層。這些dto物件被用作服務層方法的引數或返回值。
  本層中的服務分為介面和實現,呼叫時使用介面方法。這些介面繼承了IApplicationService介面,ABP框架會自動將這些介面轉為為可以以WebAPI形式呼叫的介面。本系統中定義的服務介面如下圖所示:

  然後,編寫相應的介面的實現程式碼,分別位於Log_OperateTraceService類和Log_SystemMonitorService類中,具體參見原始碼。

  它們生成的webpai介面如下圖所示(SwaggerUI顯示):

 

  在上述方法中,只有GetLogMonitorsEveryServer略為複雜。在GetLogMonitorsEveryServer方法中,根據使用者的監控範圍、顯示點數等條件檢索監控資料。若監控範圍內的資料量total大於要顯示的點數tarNum,則在從0~total-1中取出tarNum個數,儘量做到間隔相等,使用等差數列的演算法,具體實現參見程式碼中的GetDataByInterval方法。

四、網站表現層

  本層用於展現網站,是和使用者直接打交道的介面。使用的是ASP.NET MVC5.0框架,表格顯示採用的是Bootstrap-table,餅圖曲線圖顯示使用的是chart,js,曲線圖實時更新採用的是SignalR技術,

介面效果見文章開頭所示。

4.1 軌跡日誌查詢介面及實現

  軌跡日誌查詢就是根據日期、日誌型別、使用者姓名、模組名、關鍵詞等條件,從資料庫中檢索出相關資料,顯示到介面上。另外還顯示了各伺服器當前的CPU使用率和記憶體使用率。該部分所有程式碼位於LogTraceController及其對應的檢視中。如下圖所示:

  這3個方法都是呼叫應用服務層的相關方法實現。具體參考程式碼。

4.2 系統監控介面及實現  

  系統監控就是實時顯示各個伺服器的執行情況,並可根據日期、系統名稱等條件,從資料庫中檢索出詳細的監控資料,顯示到介面上。該部分所有程式碼位於LogMonitorController及其對應的檢視中。如下圖所示:

  這4個方法都是呼叫應用服務層的相關方法實現。具體參考程式碼。
  在曲線圖顯示中,使用者可以設定監控範圍、顯示點數、是否為實時模式、視窗模式等條件,在查詢模式和實時更新模式中都會根據這些條件獲取響應的資料,進行相應的顯示。這些設定可以根據使用者級或租戶級從資料庫中讀取(AbpSettings表),暫時實現設定的儲存。
  為實現實時更新功能,系統中定義了LogMonitorHub 集線器,伺服器端定時從資料庫中獲取最新的監控資訊,使用SignalR技術,前臺的updateLogMonitorDatas方法被呼叫,完成前臺的同步更新(_clients.Clients(list).updateLogMonitorDatas())。由於在該LogMonitorDal中,直接呼叫ILog_OperateTraceService 和ILog_SystemMonitorService無效,我們通過WebAPI介面的方法獲取到實時的監控資料,具體程式碼參見GetMonitorChartDataFromAPI方法(這裡的/api/services/app/log_SystemMonitorService/GetMonitorChartData就是ABP框架根據我們的服務的介面,自動為我們生成的介面)。
  另外,系統是實時更新的過程中,會檢測伺服器個數和名稱是否和上次一致,若不一致,說明有伺服器新加入或失去聯絡,此時會在有上方的訊息收件箱中進行提示,並播放音樂報警。

4.3 系統基礎功能

  1、使用者許可權管理:系統可進行使用者許可權管理,包括租戶管理、角色管理、使用者管理。本系統大部分採用ABP框架自帶的許可權系統,只是在角色中增加了每個角色的操作範圍。具體請參考程式碼。
  2、日誌記錄:本系統引用Log2Net元件,在Application_Start事件中註冊日誌系統,在各application和session事件中註冊各個日誌事件,實現系統監控日誌和軌跡日誌的記錄。

 

  因為本專案的業務比較簡單,就是從資料庫查詢出資料並顯示出來,程式碼邏輯沒有太多可以說道的地方。因此沒有詳細的貼出程式碼。把介面設計的美觀和實用,才是本系統的重點,這非本人所長,因此套用了ABP框架和BootstrapUI,效果看得過去就完工啦。程式碼參見 https://github.com/yuchen1030/Log2Net-LgWG.LogQuery

  歡迎提出問題,歡迎使用~~

相關文章