天天看點

ExceptionLess新玩法 -- 審計日志

審計日志

這算是一個挺酷的功能,把每個請求都記錄下來,之前在abp中看到過這個功能,配合可視化的界面,簡直是在裝逼

ExceptionLess新玩法 -- 審計日志

看到了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之是以這麼設定,是因為線上和測試版肯定是不同的,是以放到了配置檔案中進行維護。

ExceptionLess新玩法 -- 審計日志
ExceptionLess新玩法 -- 審計日志

玩法更新

上面已經完善的很好了,看起來也很棒。。但是讓人一臉懵逼的是,打開頁面看到的是這樣的。嗯一堆方法名沒有問題,但是第一眼望去我并不知道這是做什麼的啊。。這就有點尴尬了,如果能把方法上的注釋放上去是不是就完美了?動手開搞吧。

ExceptionLess新玩法 -- 審計日志

比較尴尬的是,注釋在編譯後是會消失的,而且通過代碼是拿不到方法上的注冊的,不像特性一樣。當然解決方案總是會有的,我們右擊項目,屬性,生成,輸出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();      

看一下效果,嗯,不錯是我想要的。

ExceptionLess新玩法 -- 審計日志

結束語,上面皆是MVC項目的做法,而在webApi中則需要再去寫一個相應的過濾器,而exceptionless對webapi的支援也不是那麼完全,比如request的參數和資訊就不會被記錄下來,是以看起來沒有Mvc項目記錄的資訊這麼豐富,當然大家可以自行完善。部落客就進行了這樣的完善。

繼續閱讀