2012年6月27日 星期三

Log Reporting Dashboard 介紹

twMVC 在 2012-06-24 所舉辦的「攻略 ASP.NET MVC - 從無到有 與 效能剖析」研討會中,我所主講的「ASP.NET MVC 偵測監控與 Log 記錄」這個主題內容裡,除了有介紹 ELMAHNLog 之外,在最後的一點時間裡有提到一個整合 Log 記錄的模組,這個模組就是「Log Reporting Dashboard」,其實原本主題說明裡給予 Log Reporting Dashboard 說明介紹的時間就只有一點點,只是向在場的研討會參加者介紹有這麼一個 ASP.NET MVC 網站模組可以用來整合顯示各個 Log 機制的記錄,而當時講完 ELMAH 與 NLog 之後的時間也所剩無幾,所以對於 Log Reporting Dashboard 就只能走馬看花的介紹,所以在這邊就寫一篇文章來稍微詳細的介紹。


Log Reporting Dashboard

作者:Darren Weir

一般而言,我們通常都會使用 Log 記錄模組來記錄系統中不管是錯誤或是系統訊息的 Log 資料,比較常用的是:Elmah, Nlog, Log4Net 以及一些其他的 Log 記錄模組,雖然有很多開發者會自己去開發一套自己的 Log 記錄模組,但我不傾向自己開發這樣的功能,因為我不想花費時間去開發另一套輪子,因為自己開發的模組並不會比現有的 Log 記錄模組來得好用,所以已經有不錯且優良的 Log 記錄模組的情況下,我建議大家使用既有的功能模組,而不建議自己花時間去開發。

建議大家使用現有模組的另一個重要的原因是,這些已經開發好的模組與我們的系統沒有太強的耦合關係,所以可以在我們不同的開發專案中去使用,而且都是相同的使用方法,不會因為專案的不同而有不同的使用方式,如果是自己開發的話,一定會遇到專案耦合的問題,當我們想要把自己開發的模組從 A 專案拿到 B 專案使用,一開始的設計如果沒有考慮仔細的話,一定會有耦合的問題,常常會因為整合而浪費更多的時間,所以在已經有這些不錯且好用的 Log 記錄模組的情況下,我們不需要自己去開發一樣的功能,除非你有自信做出來的 Log 記錄模組比 ELMAH, NLog , Log4Net 更加好用、更易於整合、更容易擴充的話。

有使用過 ELMAH 的朋友應該都知道, ELMAH 除了記錄未處理的異常例外之外,也有提供一個 Dashboard,這個 Dashboard 可以讓我們瀏覽系統中由 ELMAH 所記錄下來的 Error Log 資料,

image

然後也可以看到每筆 Error Log 資料的詳細內容,

image

 

如果系統中有使用 NLog 或是 Log4Net 的話,就不會有這樣的 Dashboard 可以去瀏覽 Log 資料,假如我們使用這些 Log 記錄模組所記錄的 Log 資料都會儲存到資料庫當中,當我們想要去查看這些 Log 資料時就必須開啟資料庫工具(例如:SSMS),然後逐一搜尋、查看,在開發期間我們可以去開啟資料庫工具來查看 Log 資料內容,因為我們可以很方便地去存取、瀏覽資料庫,一旦系統佈署到了非開發環境下,要透過資料庫工具來查看這些 Log 資料就不是那樣的方便,如果 NLog 或是 Log4Net 一樣有像 ELMAH 的 Dashboard 不就可以很方便地查看這些 Log 資料嗎?

 

Log Reporting Dashboard 就是這樣一個的網站模組,整合 Elmah, NLog, Log4Net , ASP.NET Health Monitoring,透過 Log Reporting Dashboard 就可以在同樣一個 Dashboard 介面中去瀏覽不同 Log 模組所記錄下來的 Log 資料作者 Dareen Weir 開發這一個網站模組的時候是以 ASP.NET MVC 2 來開發的,使用的是 WebForm View Engine,作者在 CodeProject 網站以及自己的部落格中有做相當詳細的說明與介紹,

http://www.codeproject.com/Articles/104112/Log-Reporting-Dashboard-for-ASP-NET-MVC

http://dotnetdarren.wordpress.com/

作者介紹 Log Reporting Dashboard 影片:

http://www.youtube.com/watch?v=Hicjp5MODpI

 

我們其實並不需要在網站中都裝上 Log Reporting Dashboard 所預設支援的 Log 記錄模組,一般來說,我們只要在系統中裝上 Elmah 以及另一套 Log 記錄模組即可,Elmah 是用來捕捉系統中未處理的異常例外,而另一套 Log 記錄模組則是用來記錄系統中想要記錄的訊息資料,不管是 Trace 訊息或是 Debug 訊息,也可以拿來記錄使用者的登出入資料、每一筆資料的新刪修時間等,我比較常用的是 NLog,另一個很多人使用的是 Log4Net,兩個 Log 記錄模組只要選一個在系統中使用就可以了。

 

接下來我將會以 2012-06-24 在研討會中所使用的範例檔案來說明 Log Reporting Dashboard,

範例檔案下載位置一:
http://dl.dropbox.com/u/26764200/20120614_ASP_NET_MVC_Elmah_NLog_Demo.7z

範例檔案下載位置二:
http://dl.dropbox.com/u/76162656/d/20120614_ASP_NET_MVC_Elmah_NLog_Demo.zip

範例檔案中的 Log Reporting Dashboard 是我已經修改過的版本,與 Dareen Weir 所提供的版本略有不同,前面有說過,原來的版本是使用 ASP.NET MVC 2 所開發的,而我提供的版本則是改用 ASP.NET MVC 3,相同的地方在於,View Engine 都還是使用 WebForn View Engine,因為我懶得用 Razor View Engine 重新改寫,另外我的版本只有使用兩種 Log 記錄模組,分別是:ELMAH 與 NLog,還有我把原版本中有使用的 OAuth 登入也給拿掉了,系統登入的功能是用 ASP.NET 表單身分驗證,以下就針對我所改寫的 Log Reporting Dashboard 做說明。

 


Log Reporting Dashboard - ASP.NET MVC 3

image

只有顯示 ELMAH 與 NLog 所記錄的 Log 資料。

 

需要經由登入後才能瀏覽 Log 資料,

image

登入成功且具有限定的登入角色權限才能查看 Log 資料,

image

 

Dashboard 的 Log 資料列表

image

可以一次看兩種的 Log

image

如果是查看 NLog 的 Log 資料,可以查看不同 Log Level 的資料

image

也可以只看其中一種,ex:Elmah

image

Elmah 的 Log 資料並沒有 Log Level 的分別,這邊預設的 Log Level 都是 Error,

所以如果選 All, Error 之外的 Level 會查不到資料,

image

另外可以選取時間區間查看 Log 資料

image

也可以選擇每個分頁的 pageSize

image

 

NLog 的 Log Details

image

 

Elmah 的 Log Details

image

 

另外 Log Reporting Dashboard 也有提供 Chart 功能,藉由 Chart 可以讓我們了解 Log 記錄模組捕捉 Log 的頻率,

image

 

以上是 Log Reporting Dashboard 網站功能介紹。

 


Log Reporting Dashboard -  ASP.NET MVC 3 的專案程式內容

這邊不會完整的詳述如何修改或是程式內容,這裡只會列出幾個比較重要以及我有修改過的地方,

 

Web.Config

ConfigSections 裡增加 section 的設定「logConfiguration」,

image

logConfiguration 的區段內容,

因為我只有使用 Elmah 與 NLog,所以 logProviders 就只增加 Elmah 與 NLog,另外 type 所對應的就是等一下會提到的 ElmahRepository 與 NLogRepository,

image

appSettings 區段裡增加「loggerTypeName」

image

這邊一定要特別提醒,這個 Log Reporting Dashboard 的 ADO.NET Entity Framework 的資料庫連接字串名稱,建議還是沿用「MvcLoggingDemoContainer」,因為有關係到程式的內容,所以不建議改用自己想要的名稱,不然程式會改到讓人瘋狂。

image

system.Web

這個區段內的 pages / namespaces 要增加兩個相關的 namespaces

image

 

Models

將網站中的 Log 記錄都給存到資料庫當中,所以 Log Reporting Dashboard 就可以去增加一個 EF edmx,這個 MvcLoggingDemo.edmx 就加入 Elmah 與 NLog 的 Log Table

image

 

Models 的程式部分是比較重要的地方,尤其是 Repository 目錄下的程式,因為只有使用到 Elmah 與 NLog,所以只有實作到 ElmahRepository 與 NLogRepository,這兩個 Repository 程式也是 Web.Config 中 logProviders 所對應到的類別,

image

LoggingController 是透過 LogRepositoryFacade.cs 這個程式來讀取不同 Log 資料,

façade Patternhttp://en.wikipedia.org/wiki/Facade_pattern

façade 表象模式,可以參考點部落 PIN 所寫的文章來做初步的了解,

http://www.dotblogs.com.tw/pin0513/archive/2010/11/01/18721.aspx

另外 façade 是法文,讀音類似於「法謝得」或「法沙得」,不要念成「法卡得」。

 

LogRepositoryFacade.cs

在我所修改的 Log Reporting Dashboard 中,也對 LogRepositoryFacade.cs 內容做了一些修改,因為改用 ASP.NET MVC 3 的關係,原版的程式在 LogRepositoryFacade.cs 的 GetByDateRangeAndType() 會出現錯誤,所以就修改了 GetByDateRangeAndType() Method 的內容,

image
(看不清楚的話,可以拿原版與我的版本做比對)

或許有人會說最後是直接轉為 List 型別是會把所有資料給一次取出來,但如果不這樣做的話,程式就是無法執行,

這也是不得不的作法,不過因為有時間區間的限制,所以不會把所有的 Log 資料給取出來才做分頁處理,

至少取出的 Log 資料數量是有一定的限制,

如果真的取出的 Log 資料很多,就必須要檢討你的系統為何會有這麼多的 Log 資料產生了。

 

ElmahRepository.cs

image
(看不清楚的話,可以拿原版與我的版本做比對)

前面說過,Elmah 的 Log 資料是沒有 Log Level,在 Log Reporting Dashboard 裡的 Elmah Log Level 都是預設為 Error,Elmah Log 的 LINQ 查詢在使用條件查詢的地方因為使用的資料庫不同的關係,所以會出現執行 Query 錯誤,所以我這邊就對於查詢的部份做了修改,將 Log Level 的條件限制移到後面才做,這樣就不會影響 Query,另外也對 LogDate 做了修改,因為原本的 LogDate 就是以 UTC 來做記錄,而顯示在 Dashboard 頁面上就需要轉化為對應使用者端的時間,我這邊直接寫死 +8 hr,

 

NLogRepository.cs

image
(看不清楚的話,可以拿原版與我的版本做比對)

NLogRepository.cs 程式修改的部份與 ElmahRepository.cs 的修改也是一樣的。

其他的修改就不再贅述。


專案有使用到 Elmah, NLog 或 Log4Net 這些 Log 記錄模組,我會建議使用 Log Reporting Dashboard,千萬不要試著把 Log Reporting Dashboard 的內容給整合到網站專案中,而是以另一個網站專案的形式獨立存在,讓 Log Reporting Dashboard 做為讀取 Log 資料的唯一窗口,可以把原本專案中有開啟的 Elmah Remote Access 給關閉,上面講得很多、很散、很亂,其實還是需要各位把範例程式給下載下來然後動手做一次就會比較清楚,真的不要只是看看,因為 Log 相關的模組或是功能,真的是需要動手做過之後才會明白怎麼使用,

 

P.S.
我所提供的範例程式,不管 Elmah 還是 NLog 都是把 Log 資料給儲存在 MS SQL Server 中,範例程式所含的 Log Reporting Dashboard,裡面的程式也是依據 Log 儲存在 MS SQL Server 的情境下做修改的,所以如果各位所使用的資料庫不是 MS SQL Server,Log Reporting Dashboard 的程式就需要做若干的修改後才能執行,對應其他資料庫的使用與修改就留待各位自行處理,我這邊就不做個別的處理。

 

以上

沒有留言:

張貼留言

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。