controller層統(tǒng)一攔截進行日志處理

前言

在項目中添加統(tǒng)一日志時,我們往往會用到aop進行切面處理董饰,常用在controller層添加切面奥喻,以處理請求和返回的各項參數(shù)數(shù)據(jù)。

使用切面進行日志處理

下面我們就看一個例子說明基本的使用方式:

package com.ding.test.core.aspect;

import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

@Aspect
@Component
public class LogAspect {
private final static Logger LOGGER = LoggerFactory.getLogger(LogAspect.class);
@Pointcut("execution(* com.ding..controller.*.*(..))")
public void printLog() {

}
/**
 * 會話ID
 */
private final static String SESSION_TOKEN_KEY = "sessionTokenId";

@Around("printLog()")
private Object doAround(ProceedingJoinPoint pjp) throws Throwable {
    long startTime = System.currentTimeMillis();
     String token = java.util.UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
     MDC. put(SESSION_TOKEN_KEY, token);
    RequestAttributes ra = RequestContextHolder.getRequestAttributes();
    ServletRequestAttributes sra = (ServletRequestAttributes) ra;
    HttpServletRequest request = sra.getRequest();

    // 獲取請求相關信息
    String url = request.getRequestURL().toString();
    String method = request.getMethod();
    String uri = request.getRequestURI();
    String queryString = request.getQueryString();

    // 獲取調(diào)用方法相信
    Signature signature = pjp.getSignature();
    String className = signature.getDeclaringTypeName();
    String methodName = signature.getName();
    LOGGER.info("請求開始, {}#{}() URI: {}, method: {}, URL: {}, params: {}", className, methodName, uri, method, url,
            queryString);
    //result的值就是被攔截方法的返回值
    try {
        //proceed方法是調(diào)用實際所攔截的controller中的方法侈贷,這里的result為調(diào)用方法后的返回值
        Object result = pjp.proceed();
        long endTime = System.currentTimeMillis();
        //定義請求結束時的返回數(shù)據(jù),包括調(diào)用時間等脂、返回值結果等
        LOGGER.info("請求結束, {}#{}(), URI: {}, method: {}, URL: {}, time: {}ms, result: {} ", className, methodName,
                uri, method, url, (endTime - startTime), result);
        return result;
    } catch (Exception e) {
        long endTime = System.currentTimeMillis();
        LOGGER.error("請求出錯, {}#{}(), URI: {}, method: {}, URL: {}, time: {}ms", className, methodName, uri, method,
                url, (endTime - startTime), e);
        throw e;
    }finally {
        MDC. remove(SESSION_TOKEN_KEY);
    }
 }
}

本來spring就自帶一套aop實現(xiàn)俏蛮,我們直接使用此實現(xiàn)即可,本來使用aop還需要定義一些xml文件上遥,但由于我們使用的是spring-boot框架搏屑,這一步就省略掉了。也就是說粉楚,在spring-boot中辣恋,我們可以直接使用aop而不需要任何的配置。

這里我們分析一下上面的示例代碼:

@Aspect:描述一個切面類,定義切面類的時候需要打上這個注解

@Component:泛指組件抑党,當組件不好歸類的時候包警,我們可以使用這個注解進行標注。

@PointCut("execution(* com.ding..controller..(..))"):定義切點底靠,括號內(nèi)的為攔截的路徑害晦,這里指目錄下的controller中所以方法

這里定義切點的方法為printLog(),在進行前置通知暑中、后置通知壹瘟、環(huán)繞通知的時候,就可以根據(jù)這個方法進行攔截鳄逾。這里我們用到了環(huán)繞通知的方式: @Around("printLog()")稻轨,定義后,在進行controller中方法調(diào)用時就會先調(diào)用這里的doAround方法雕凹。方法中的含義在注釋中已經(jīng)寫清楚了殴俱,可以打斷點再看每段代碼的具體含義。

后記

本文通過一個案例講解了一下使用切面進行日志處理的功能枚抵,重點在于配置切點线欲、環(huán)繞通知、方法調(diào)用汽摹。這些成功后就按照自己需求進行日志內(nèi)容的輸出了李丰。

============================================================
輸出倒逼輸入,作為技術人員教是最好的學習方法逼泣,我是一名愛思考趴泌、愛學習、涉獵廣泛想搞事情的程序員拉庶。

堅持就是娛樂嗜憔,因為驚喜更重要
============================================================

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市砍的,隨后出現(xiàn)的幾起案子痹筛,更是在濱河造成了極大的恐慌莺治,老刑警劉巖廓鞠,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谣旁,居然都是意外死亡床佳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門榄审,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砌们,“玉大人,你說我怎么就攤上這事±烁校” “怎么了昔头?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵,是天一觀的道長影兽。 經(jīng)常有香客問我揭斧,道長,這世上最難降的妖魔是什么峻堰? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任讹开,我火速辦了婚禮,結果婚禮上捐名,老公的妹妹穿的比我還像新娘旦万。我一直安慰自己,他們只是感情好镶蹋,可當我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布成艘。 她就那樣靜靜地躺著,像睡著了一般贺归。 火紅的嫁衣襯著肌膚如雪狰腌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天牧氮,我揣著相機與錄音琼腔,去河邊找鬼。 笑死踱葛,一個胖子當著我的面吹牛丹莲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尸诽,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼甥材,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了性含?” 一聲冷哼從身側響起洲赵,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎商蕴,沒想到半個月后叠萍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡绪商,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年苛谷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片格郁。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡腹殿,死狀恐怖独悴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锣尉,我是刑警寧澤刻炒,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站自沧,受9級特大地震影響落蝙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜暂幼,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一筏勒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旺嬉,春花似錦管行、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至雨效,卻和暖如春迅涮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背徽龟。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工叮姑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人据悔。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓传透,卻偏偏與公主長得像,于是被迫代替她去往敵國和親极颓。 傳聞我的和親對象是個殘疾皇子朱盐,可洞房花燭夜當晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 本章內(nèi)容: 面向切面編程的基本原理 通過POJO創(chuàng)建切面 使用@AspectJ注解 為AspectJ切面注入依賴 ...
    謝隨安閱讀 3,158評論 0 9
  • IoC 容器 Bean 的作用域 自定義作用域?qū)崿F(xiàn) org.springframework.beans.facto...
    Hsinwong閱讀 2,484評論 0 7
  • Spring致力于提供一種方法管理你的業(yè)務對象。在大量Java EE的應用中菠隆,隨處可見Spring兵琳。今天我將簡單的...
    JAVA架構師的圈子閱讀 1,340評論 0 16
  • 概述 Spring是什么? Spring是一個開源框架骇径,為了解決企業(yè)應用開發(fā)的復雜性而創(chuàng)建的躯肌,但是現(xiàn)在已經(jīng)不止于企...
    瑯筑閱讀 1,172評論 2 8
  • AOP,也就是面向方面編程或者說面向面編程既峡,是一種很重要的思想羡榴。在企業(yè)級系統(tǒng)中經(jīng)常需要打印日志碧查、事務管理這樣針對某...
    樂百川閱讀 909評論 0 8