Log2Net日誌查詢網站代碼解析

   在前面的幾節中,咱們介紹了Log2Net的使用方法和代碼設計。使用這個組件,咱們能夠方便地將日誌記錄到數據庫中,那麼,咱們怎麼能看到這些日誌呢?因而,日誌查詢網站應運而生。效果圖以下: git

 

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

1、整體介紹

  日誌查詢網站由三部分組成:一、系統監控;二、日誌查詢;三、權限設計。本系統對應的數據庫爲讀寫分離中的讀,使用的數據庫爲LogTrace_R、LogMonitor_R以及LogQuery,項目名稱爲LgWG.LogQuery。LgWG意爲Log2Net Work Group。web

  本網站採用ABP框架,須要對如下知識有所瞭解:ASP.NET MVC 五、Web API 二、DDD領域驅動設計 (Entities、Repositories、Domain Services、Domain Events、Application Services、DTOs等)、Ioc/DI、Castle windsor (依賴注入容器)、Entity Framework 六、數據遷移、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命令,系統會自動爲咱們建立默認的數據庫。而後運行項目就能夠獲得一個直接運行的網站,能夠進行權限管理(租戶管理、角色管理、用戶管理)等。咱們在此基礎上添加咱們的業務功能實現日誌查詢。api

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

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

  ABP框架中,官方推薦使用code first,即先寫領域核心層實體,建立數據庫遷移,而後生成數據庫。對於LogQuery數據庫,確實是這樣的(對此數據庫的實體,ABP已經爲咱們作好了,咱們只須要upodate數據庫便可)。然而對於LogTrace_R和LogMonitor_R數據庫,他們已經存在了,咱們採用Code first from database的方式來生成實體和數據庫上下文。具體作法是在EF項目下添加ADO.NET實體數據模型,而後選擇Code first from database,選擇數據庫鏈接以後就會建立實體模型,而後咱們將這裏生成的實體剪切到core項目下,即完成了core層的實體建立工做。session

  LgWG.LogQuery.Core層定義系統的領域,即定義系統使用的實體,定義倉儲接口等。本項目定義了LogTrace和LogMonitor兩個領域,分別定義了其實體和倉儲接口。咱們定義了泛型的基礎倉儲接口IBaseRepository,這兩個倉儲接口繼承之。
  LgWG.LogQuery.EntityFramework層爲倉儲實現,咱們分別定義這兩個實體接口的實現。通常狀況下,咱們只須要繼承EfRepositoryBase就能夠了,EfRepositoryBase已經爲咱們定義了常見的增刪改查方法的實現,只有對一些特殊的方法才須要咱們本身來實現。app

3、應用服務層

  本層(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方法。

4、網站表現層

  本層用於展示網站,是和用戶直接打交道的界面。使用的是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 系統基礎功能

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

 

  由於本項目的業務比較簡單,就是從數據庫查詢出數據並顯示出來,代碼邏輯沒有太多能夠說道的地方。所以沒有詳細的貼出代碼。把界面設計的美觀和實用,纔是本系統的重點,這非本人所長,所以套用了ABP框架和BootstrapUI,效果看得過去就完工啦。代碼參見 https://github.com/yuchen1030/Log2Net-LgWG.LogQuery

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

相關文章
相關標籤/搜索