.net core Blazor+自定義紀錄檔提供器實現實時紀錄檔檢視器

2022-10-30 18:02:39

場景

我們經常遠端連線伺服器去檢視紀錄檔,比較麻煩,如果直接存取專案的某個頁面就能實時檢視紀錄檔就比較奈斯了,花了1天研究了下.net core 紀錄檔的原理,結合blazor實現了基本效果。

實現原理

  1. 自定義紀錄檔提供器,將紀錄檔記錄到記憶體中,捲動10W條刪除。
  2. 提供blazor元件,實時從記憶體中讀取後顯示,搞了個簡單的條件搜尋。

為毛用記憶體儲存?因為快,主要目的是實時監控,方便偵錯,只需要最近一段時間的資料,所以記憶體是最合適的。

由於資料是儲存在全域性靜態變數中的(執行緒安全的),所以多個人同時開啟頁面檢視紀錄檔其實看的是同一份資料。

這個庫預設提供了與.net core預設的紀錄檔框架的繼承,但你也可以用自己的方式把資料儲存到那個靜態變數中。

如何使用?

必須是asp.net 6.x的專案,至於是mvc webapi razorpages還是blazor無所謂,都可以簡單設定支援blazor server,assembly模式按沒考慮過。

我的專案是webapi,啟用blazor server有影響嗎?完全木有,asp.net core本就是基礎web框架,同一個專案可以同時支援webapi mvc razorpage和blazor的。

1、啟用blazor server(若你本來是,直接跳過)

若你不熟悉如何在現有專案整合blazor server,可以建個空的blazor server專案,然後按下面的步驟操作

在startup.cs或program.cs中

//註冊服務
services.AddRazorPages(); services.AddServerSideBlazor();

//設定路由

app.UseEndpoints(endpoints =>
{
  endpoints.MapDefaultControllerRoute();
  endpoints.MapBlazorHub();
  endpoints.MapFallbackToPage("/_Host");
});

然後將你新建的空的blazor server專案中的如下檔案和目錄拷貝過來

  1. wwwroot:裡面包含預設樣式,若你完全決定自己搞樣式,可以不拷貝
  2. Pages:裡面包含blazor server中基礎的頁面,其中_Host.cshtml(用來放blazor server根元件的)、_Layout.cshtml(_Host.cshtml依賴這個佈局,我們還會在裡面放公用的css js參照)檔案必拷
  3. Shared、公共元件,比如blazor的佈局、選單等元件
  4. _Imports.razor、為所有blazor元件做全域性名稱空間匯入的,注意它只為blazor元件服務,並不是global using,這個是給整個專案用的
  5. App.razor ,blazor server的根元件,它被放在_Host.cshtml中的。在此頁面頂部:<Router AppAssembly="@typeof(App).Assembly" AdditionalAssemblies="new Assembly[]{ typeof(BlazorServerLogger).Assembly}">

注意修改名稱空間,尤其注意_Layout.cshtml head部分<link href="ZLJ.FYJIOT.ApiHost.styles.css" rel="stylesheet" />前面的名稱空間替換為你當前專案的名稱空間,這個是當前專案中的元件的樣式檔案,自動生成的

2、安裝咱的紀錄檔包:BXJG.BlazorServerLogger

3、設定

在program.cs中

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureLogging(b=>b.AddBlazorServerLogger())

現在啟動,導航到 /log-blazor 頁面看效果。

自定義設定和樣式

目前做的比較簡單,預設捲動刪除10W條、記錄所有類別和級別的紀錄檔、以及元件的樣式都是固定的,有興趣可以自己改。

預設為你建好了頁面 /log-blazor,這要求你在App.razor中設定AdditionalAssemblies="new Assembly[]{ typeof(BlazorServerLogger).Assembly}",如果你不想要這個頁面,可以自己建頁面,然後引入BlazorServerLogger元件,升值你也可以直接讀取BlazorServerLoggerExt.MsgContainer中的當前紀錄檔資訊,自己做顯示。

非微軟的紀錄檔框架的整合

如果你記錄紀錄檔使用的不是微軟的ILogger介面,或者你使用的第三方紀錄檔框架沒有與微軟的紀錄檔框架整合,那麼上面的步驟3就不用做了,而是在記錄紀錄檔時直接呼叫BlazorServerLoggerExt.Add靜態方法就行了。

不過這樣你原來的程式碼得改,最好與你自己目前的框架做個整合,舉個例子:若你原來是直接使用的log4net,則你需要自定義一個Appender,然後呼叫BlazorServerLoggerExt.Add,這樣你原來記錄紀錄檔的方式不變。

資源

原始碼:https://gitee.com/bxjg1987_admin/abp/tree/master/src/Libs/BXJG.BlazorServerLogger