審計日志
這算是一個挺酷的功能,把每個請求都記錄下來,之前在abp中看到過這個功能,配合可視化的界面,簡直是在裝逼
看到了exceptionless後,心念一動,我也可以根據它做一個審計日志的功能。這裡需要一些MVC過濾器的知識,不同的同學請谷歌查一下資料。
Next
使用過濾器, 在action執行完畢後執行此方法,首先建立一個attribute繼承自ActionFilterAttribute重寫OnActionExecuted方法,使用action名稱做為Message使用Controller名稱做為标簽進行記錄,關于到底要記錄一些什麼,就根據各位項目的需求了。
/// <summary>
/// Mvc action執行前後處理
/// </summary>
public class MvcActionProcessFilterAttribue : ActionFilterAttribute
{
/// <summary>
/// 方法執行後進行的操作
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
//記錄審記日志
var con = filterContext.Controller as Controller;
var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
var actionName = filterContext.ActionDescriptor.ActionName;
ExceptionlessClient.Default.CreateFeatureUsage(actionName).AddTags(controllerName).Submit();
}
}
可能會有很多個Web項目,一個項目去寫一個肯定是不明智的,這裡我把審計日志和FilterConfig放到了基礎設施層,友善Web項目使用,使用起來很簡單,隻需要在Global添加幾行短短的代碼就一切搞定了,部落客的圖中exceptionlesskey之是以這麼設定,是因為線上和測試版肯定是不同的,是以放到了配置檔案中進行維護。
玩法更新
上面已經完善的很好了,看起來也很棒。。但是讓人一臉懵逼的是,打開頁面看到的是這樣的。嗯一堆方法名沒有問題,但是第一眼望去我并不知道這是做什麼的啊。。這就有點尴尬了,如果能把方法上的注釋放上去是不是就完美了?動手開搞吧。
比較尴尬的是,注釋在編譯後是會消失的,而且通過代碼是拿不到方法上的注冊的,不像特性一樣。當然解決方案總是會有的,我們右擊項目,屬性,生成,輸出XML文檔。
這樣就可以讀取文檔根據action和contrller去拿到我們想要的注釋了,因為每個項目的文檔名是不一樣的(當然可以設定成一樣,是以我後面說的話可以選擇忽視)我在webconfig中配置了每個項目的名稱,然後拿到名稱後去讀取XML檔案,這個時候我們想要的注釋就已經拿到了
var proejctName = ConfigurationManager.AppSettings["ProjectName"] as string;
//拿到包含注釋的xml文檔
var xml = XDocument.Load(con.Server.MapPath(@"~/bin/" + proejctName + ".XML"));
var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
var actionName = filterContext.ActionDescriptor.ActionName;
//拿到方法上的注釋
//拿到方法上的注釋沒有參數的方法沒有(括号
var summary = (from member in xml.Elements("doc").Elements("members").Elements("member") where member.Attribute("name").Value.ToString().Contains("." + controllerName + "Controller." + actionName + "(") select member.Element("summary").Value).FirstOrDefault() ??
(from member in xml.Elements("doc").Elements("members").Elements("member") where member.Attribute("name").Value.ToString().Contains("." + controllerName + "Controller." + actionName) select member.Element("summary").Value).FirstOrDefault();
看一下效果,嗯,不錯是我想要的。
結束語,上面皆是MVC項目的做法,而在webApi中則需要再去寫一個相應的過濾器,而exceptionless對webapi的支援也不是那麼完全,比如request的參數和資訊就不會被記錄下來,是以看起來沒有Mvc項目記錄的資訊這麼豐富,當然大家可以自行完善。部落客就進行了這樣的完善。