審計日志
這算是一個挺酷的功能,把每個請求都記錄下來,之前在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項目記錄的信息這么豐富,當然大家可以自行完善。博主就進行了這樣的完善。