ExceptionLess新玩法 -- 審計日志


審計日志

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

image

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

image

image

 

玩法升級

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

image

 

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

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

image

 

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM